びっくり!以下のステートメントは、 で有効ですSQL SERVER
。
SELECT +'ABCDEF'
文字列型の演算子としてSQL Server
定義さ+
れていますか?Unary
びっくり!以下のステートメントは、 で有効ですSQL SERVER
。
SELECT +'ABCDEF'
文字列型の演算子としてSQL Server
定義さ+
れていますか?Unary
この質問に対する私自身の回答は次のとおりです (最後の更新も参照してください)。
いいえ、文字列式で定義されたそのような単項演算子はありません。これはバグである可能性があります。
説明:
指定されたステートメントは有効であり、以下の結果が生成されます。
(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)
しかし、ある場合は、文字列に適用される演算子をどのような目的で使用するかを知っておくとよいでしょう。使い方が想像つかない!
アップデート
ここでは、これは以前のバージョンのバグであったと述べていますが、下位互換性のために修正されません。