这是我的动态查询:
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
但我得到的名字也是空的。我在这里错过了什么?任何帮助将不胜感激。
答案 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