3

誰かがこの行動を説明できるかどうか疑問に思いましたか?

DECLARE @RandomParam1 NVARCHAR
DECLARE @RandomParam2 NVARCHAR
DECLARE @RandomParam3 NVARCHAR
SET @RandomParam1 = '0HelloWorld'
SET @RandomParam2 = '9HelloWorld'
SET @RandomParam3 = '15HelloWorld'

select 1 where '0' = @RandomParam1  -- true
select 1 where '0' = '0HelloWorld'  -- false

select 1 where '9' = @RandomParam2  -- true
select 1 where '15' = @RandomParam3 -- false

パラメータを使用した文字列の比較で、パラメータを使用しない場合とは異なる結果が得られるのはなぜですか?そして、なぜそれは「0」=「0whatever」と主張するのですか?

パラメータがそれを数値として比較しようとしている可能性があると思いますが、最後の例も真である必要があります。

何か案は?

4

2 に答える 2

9

デフォルトの長NVARCHARは 1 です。事実上、3 つのパラメーターにはすべて 1 文字だけが含まれます。

宣言を次のように変更した場合

DECLARE @RandomParam1 NVARCHAR(32)
DECLARE @RandomParam2 NVARCHAR(32)
DECLARE @RandomParam3 NVARCHAR(32)

期待していた動作が得られます。

nchar と nvarchar

n がデータ定義ステートメントまたは変数宣言ステートメントで指定されていない場合、デフォルトの長さは 1 です。

于 2012-05-02T11:44:09.543 に答える
2

変数に長さを指定していないため、デフォルトの長さは1になります。

DECLARE @RandomParam1 NVARCHAR(20)
DECLARE @RandomParam2 NVARCHAR(20)
DECLARE @RandomParam3 NVARCHAR(20)

LENGTH変数にを追加しました。

于 2012-05-02T11:46:26.820 に答える