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

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

如果您将声明更改为

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 回答