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