4

びっくり!以下のステートメントは、 で有効ですSQL SERVER

SELECT  +'ABCDEF'

文字列型の演算子としてSQL Server定義さ+れていますか?Unary

4

1 に答える 1

6

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

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

説明:

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

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

これは、記号SELECTを使用せずにステートメントを実行することと同じです。+

SELECT  'ABCDEF'

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

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

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.

+演算子が数値以外の文字列値で誤って使用された場合、同様のケースでエラーを生成すべきではないのはなぜですか?

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

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

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

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

アップデート

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

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

于 2012-11-04T13:25:57.057 に答える