SQL Server变量

Col*_*lin 4 sql sql-server-2008

为什么这些查询会返回不同的值?第一个返回结果集按预期,但第二个(据我所知,完全相同)不会.有什么想法吗?

1:

declare @c varchar(200)

set @c = 'columnName'

select top 1 * 
from myTable 
where @c is not null 
      and len(convert(varchar, @c)) > 0
Run Code Online (Sandbox Code Playgroud)

2:

SELECT top 1 * 
FROM myTable 
WHERE columnName IS NOT NULL 
      and len(convert(varchar,columnName)) > 0   
Run Code Online (Sandbox Code Playgroud)

Aus*_*nen 6

这是因为它们不是同一个查询 - 您的变量文本不会被内联到查询中.

在查询1中,您验证的@c是非null(true,您设置它)并且它的长度大于0(true,它是10).由于两者都是真的,查询1变为:

select top 1 * from myTable
Run Code Online (Sandbox Code Playgroud)

(它将根据适当的索引返回myTable中的第一行.)

编辑: 解决有关问题的评论.

declare @myTable table
(
    columnName varchar(50)
)

insert into @myTable values ('8')

declare @c nvarchar(50)
set @c = 'columnName'

select top 1 * 
from @myTable 
where @c is not null 
      and len(convert(varchar, @c)) > 0

select top 1 * 
from @myTable 
where columnName is not null
      and len(convert(varchar,columnName)) > 0
Run Code Online (Sandbox Code Playgroud)

现在当我运行这两个查询时返回相同的结果.你必须告诉我在哪里我歪曲你的实际数据/查询以获得更多帮助(或者只是扩展它以找到解决方案).