在where where condition返回的空名称

时间:2013-09-20 05:21:43

标签: sql sql-server sql-server-2008 tsql dynamic-sql

这是我的动态查询:

exec sp_executesql N'SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY NAME asc) peta_rn, peta_query.* 
    From (Select BOOK, PageINT, PageCHAR NAME, TYPE, PDF From test1 cdn
                            Inner Join test2 cwi
                                On cwi.ID = cdn.ID Where 1=1  And IsNull(NAME,'''') Like COALESCE(@0,'''') + ''%''  )
                                 as peta_query) peta_paged WHERE peta_rn>@1 AND peta_rn<=@2',N'@0 varchar(4000),@1 bigint,@2 bigint',@0='Miller',@1=0,@2=50

正如您所看到的,我只是在搜索Miller但我得到的名字也是空的。我在这里错过了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我发现SQL表达式中存在一个问题,可能是内部选择中问题的根源:

From (Select BOOK, PageINT, PageCHAR NAME, TYPE, PDF From test1 cdn
    Inner Join test2 cwi
    On cwi.ID = cdn.ID 
    Where 1=1  And IsNull(NAME,'''') Like COALESCE(@0,'''') + ''%''  )

我相信您打算引用IsNull(NAME,'''') Like COALESCE(@0,'''') + ''%''的谓词PageCHAR NAME,但这种情况并未发生。

SELECT语句是要执行的最后部分之一,WHERE将首先执行,并且不知道PageCHAR被别名为NAME

因此,如果您打算使用PageCHAR,请将谓词更改为IsNull(PageCHAR,'''') Like COALESCE(@0,'''') + ''%''

NAME来自哪里我不知道。你的桌子里某处可能有一个NAME列,或者可能发生了一些非常疯狂的事情,因为NAME确实存在于CTE之外,但我不认为就是这样。

在谓词的左侧应用函数肯定会使它不使用索引,所以请确保你真的想要这样做。

以下是有关选择陈述中执行顺序的有用链接:http://www.c-sharpcorner.com/Blogs/4536/order-of-execution-of-select-statement.aspx