SQL中 exec sp_executesql 執行 where in 引數方法
在公司專案中,需要用到一個方法,就是批量傳入記錄編號 通過 where jlbh in()的方法查詢記錄;
平時直接用 select * from JDZS where Jlbh in(‘001’,‘002’,‘003’) 完全沒有問題。
但是我在用到的Fastreport報表外掛中,會使用引數傳入查詢條件來執行SQL語句,原SQL語句“select Jlbh from JDZS where Jlbh in(''[email protected]+'')”加上引數就變成:
exec sp_executesql N'select * from JDZS where Jlbh in(@Jlbh)',N'@Jlbh nvarchar(50)',@Jlbh='2018090701016'
以上方法中,如果引數@Jlbh 傳入多個記錄編號,就會出現查詢無結果。
通過以下幾種方法都試過,要麼無結果,要麼引數中只能傳入一個記錄編號,要麼就在FastRepot中報錯;
--方法一
exec sp_executesql N'select Jlbh as 記錄編號,QbBh as 氣表編號 from JDZS where Jlbh in (''[email protected]+'')',N'@jlbhStr varchar(95)',@jlbhStr='''2018090701016'''
--方法二
exec sp_executesql N'exec(''select Jlbh from JDZS where Jlbh in('''''' [email protected]+'''''')'')',N'@jlbhStr nvarchar(4000)',@jlbhStr=N'2018090701016'
--方法三
exec sp_executesql N'exec(''select Jlbh from JDZS where Jlbh in(''''[email protected]+'''')'')',N'@jlbhStr nvarchar(4000)',@jlbhStr=N'''2018090701016'''
--方法四
exec sp_executesql N'exec(''select * from JDZS where Jlbh in('' [email protected]+'')'')',N'@jlbhStr nvarchar(4000)',@jlbhStr=N'''2018090701016'',''2018090701015'''
--只有方法四能夠執行成功,但是把其中的exec(''select * from JDZS where Jlbh in(''[email protected]+'')'') 放入 FastReport中要報錯;
網上找了一篇相似的問題:
同時按照這個方法執行後還是查詢無結果。
但是看到最終的答案就是相當於把第一個回答中的內容改變了方式執行。於是就想到了替換的方式。既然
exec('select Jlbh from JDZS where Jlbh in('[email protected]+')') 是能夠被執行的。那就把這句話放入sp_executesql 中執行,把單引號部分用雙引號替換一下。
最終exec 執行的語句就是:
--通過exec declare變數方法執行是可行的;
declare @sqlids NVARCHAR(4000)
set @sqlids='''2018090701016'',''2018090701015'''
exec('select * from JDZS where Jlbh in (' + @sqlids + ')')
--將sp_executesql 中可執行的sql查詢語句
exec sp_executesql N'exec(''select * from JDZS where Jlbh in(''[email protected]+'')'')',N'@jlbhStr nvarchar(4000)',@jlbhStr=N'''2018090701016'',''2018090701015'''
--替換為 執行exec體:
exec sp_executesql N' declare @sqlids NVARCHAR(4000)
set @[email protected]
exec(''select * from JDZS where Jlbh in ('' + @sqlids + '')'')',N'@jlbhStr nvarchar(4000)',@jlbhStr=N'''2018090701013'',''2018090701012'''
當執行引數 @jlbhStr=N'''2018090701016'',''2018090701015''' 的時候就可以查詢出想要的結果;而我最終要的就是sp_executesql(' ')中的部分,
所以最終的語句就是把原來的“ select Jlbh from JDZS where Jlbh in(''[email protected]+'')” 替換為:
declare @sqlids NVARCHAR(4000)
set @[email protected]
exec('select * from JDZS where Jlbh in (' + @sqlids + ')')
實際傳入的引數變數的字元按照平時SQL中的 where in方法即可:set @jlbhStr='''2018090701016'',''2018090701015''';