sql >> データベース >  >> RDS >> Sqlserver

SQL Server:数値以外の文字列に対する+(単項)演算子

    この質問に対する私自身の回答は次のとおりです(最後の更新も参照してください):

    いいえ、文字列式で定義されたそのような単項演算子はありません。これはバグである可能性があります。

    説明:

    指定されたステートメントは有効であり、次の結果が生成されます。

    (No column name) 
    ----------------
    ABCDEF
    (1 row(s) affected)
    

    これは、SELECTを実行するのと同じです +を使用しないステートメント サイン:

    SELECT  'ABCDEF'
    

    エラーを発生させずにコンパイルされ、実際には正常に実行されると、+のような印象を与えます。 Unaryとして動作しています 指定された文字列に対する操作。ただし、公式のT-SQL ドキュメントには、そのような演算子についての言及はありません。実際、「文字列演算子 」というタイトルのセクションで "、+ + (String Concatenation)である2つの文字列操作に表示されます および+= (String Concatenation);しかし、どちらもUnaryではありません 手術。また、「単項演算子 」というタイトルのセクション "、3つの演算子が導入されましたが、そのうちの1つだけが+ (Positive) オペレーター。ただし、これだけが関連していると思われる場合は、+ (Positive)の説明として、この演算子も数値以外の文字列値とは関係がないことがすぐに明らかになります。 演算子は、この演算子が数値にのみ適用可能であることを明示的に示しています。 "値を返します数値式の(単項演算子) "。

    おそらく、この演算子は、ここで使用されているような数値として正常に評価された文字列値を正常に受け入れるためにあります:

    SELECT  +'12345'+1
    

    上記のステートメントを実行すると、数値として評価された指定された文字列とそれに追加された数値(1)の両方の合計である数値が出力に生成されます。 ここでは、明らかに他の金額である可能性があります:

    (No column name) 
    ----------------
    12346
    (1 row(s) affected)
    

    ただし、以下の質問につながるため、この説明が正しいとは思えません。

    まず、この説明が正しいことを認めれば、+'12345'のような表現であると結論付けることができます。 数値に評価されます。もしそうなら、なぜこれらの数字がDATALENGTHなどの文字列関連の関数に表示される可能性があるのですか? 、LEN 、など。次のようなステートメントが表示されます:

      SELECT  DATALENGTH(+'12345')
    

    は非常に有効であり、次のようになります。

     (No column name) 
    ----------------
    5
    (1 row(s) affected)
    

    これは、+'12345'を意味します 数値ではなく文字列として評価されています。これはどのように説明できますか?

    次に、-を使用した同様のステートメント このような演算子:

     `SELECT  -'ABCDE'` 
    

    またはこれさえ:

    `SELECT  -'12345'` 
    

    以下のエラーを生成します:

    Invalid operator for data type. Operator equals minus, type equals varchar.
    

    +の場合、同様のケースでエラーが発生するのではないでしょうか。 演算子が数値以外の文字列値で誤って使用されていますか?

    したがって、これら2つの質問により、これが同じ+ (unary)であるという説明を受け入れることができません。 数値のドキュメントで紹介されている演算子。他に言及されていないので、意図的に言語に追加されている可能性があります。バグの可能性があります。

    次のようなステートメントでもエラーが生成されない場合、問題はより深刻に見えます。

    SELECT ++++++++'ABCDE'
    

    この種のステートメントを受け入れるプログラミング言語が他にあるかどうかはわかりません。ただし、ある場合は、+ (unary)をどのような目的で使用しているかを知っておくと便利です。 文字列に適用される演算子。使い方が想像できない!

    更新

    ここでは、これは以前のバージョンのバグであると述べていますが、下位互換性のために修正されません:

    調査の結果、この動作は仕様によるものです。 +は単項演算子なので。したがって、パーサーは「+」を受け入れ、この場合、「+」は単に無視されます。この動作を変更すると、下位互換性に多くの影響があるため、変更するつもりはありません。修正により、アプリケーションコードに不要な変更が導入されます。




    1. JOOQを使用してPostgreSQLにJSON列を含む更新可能なレコードを挿入するにはどうすればよいですか?

    2. macos10.13.3でmysqlパスワードをリセットする方法

    3. SQLServerで削除されたレコードを復元するノウハウ

    4. 特定のエンティティとすべてのエンティティを返すことができるOracleストアドプロシージャを作成する方法