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

时间:2012-05-02 11:40:42

标签: sql sql-server tsql

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

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'?

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

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

NVARCHAR默认长度为1.您的三个参数实际上只包含一个字符。

如果您将声明更改为

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

你会得到你期待的行为。

nchar and nvarchar

  

在数据定义或变量声明中未指定n时   声明,默认长度为1。

答案 1 :(得分:2)

您没有为变量指定长度,因此默认长度为1。

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

为您的变量添加了LENGTH