T-SQL,使用参数与前导数字进行字符串比较会返回误报

Cla*_*sse 3 sql t-sql sql-server

我想知道是否有人可以解释这种行为?

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
Run Code Online (Sandbox Code Playgroud)

为什么与参数进行字符串比较会产生与没有参数不同的结果?为什么它声称'0'='0whatever'?

我知道可能是参数试图将它作为数字进行比较,但最后一个例子应该是真的.

有任何想法吗?

Lie*_*ers 9

默认长度NVARCHAR为1.您的三个参数有效地都含有仅仅一个单个字符.

如果您将声明更改为

DECLARE @RandomParam1 NVARCHAR(32)
DECLARE @RandomParam2 NVARCHAR(32)
DECLARE @RandomParam3 NVARCHAR(32)
Run Code Online (Sandbox Code Playgroud)

你会得到你期待的行为.

nchar和nvarchar

如果未在数据定义或变量声明语句中指定n,则默认长度为1.