Sql-Server
使用 IN 語句執行 SQL 查詢
我沒有得到正確的結果
DECLARE @Id as nvarchar(MAX) = N'''2'',''3''' DECLARE @spparams as nvarchar(max) =N'@Id as nvarchar(max)' EXEC sp_executesql N'select * from temp_table where cast(Id as nvarchar(50)) in (@Id)',@spparams,@Id= @Id
我無法得到結果。有人可以幫我弄這個嗎?
我知道只有單引號有一些錯誤,我嘗試了很多方法但沒有得到結果。
N'''2'',''3'''
是一個標量值 - 如在字元串中:“‘2’,‘3’”。當您將其用作查詢中的參數時,SqlServer 將其視為單個字元串。一種解決方案可能是使用
WHERE IN (SELECT value FROM string_split(@Id, ','))
. 這會將它分成兩個字元串:$$ “‘2’”,"‘3’" $$- 但同樣:字元串中帶有文字單引號。因此,當您
CAST(Id as NVARCHAR(50))
將 Id 作為字元串但沒有刻度時:$$ “1”,“2”,“3” $$,這當然不匹配。 所以:DECLARE @Id AS nvarchar(MAX) = N'2,3' DECLARE @spparams as nvarchar(max) =N'@Ids nvarchar(MAX)' EXEC sp_executesql N'SELECT * FROM temp_table where cast(Id AS nvarchar(50)) IN (SELECT value FROM string_split(@Ids,'',''))',@spparams,@Ids= @Id
更好的解決方案是不將數字視為字元串
DECLARE @Id AS nvarchar(MAX) = N'2,3' DECLARE @spparams as nvarchar(max) =N'@Ids nvarchar(MAX)' EXEC sp_executesql N'SELECT * FROM temp_table where Id IN (SELECT convert(int, value) FROM string_split(@Ids,'',''))',@spparams,@Ids= @Id
您的標量字元串就是這樣:一個字元串。編譯器不會將您的值直接嵌入到您的查詢中。它在編譯期間創建一個佔位符字元串變數,然後將該值作為單個字元串直接綁定到該變數。
這裡真正的解決方案是通過使用表值參數來保持一切基於集合,而不是亂用字元串。
首先創建表類型:
CREATE TYPE dbo.IntList (Value int PRIMARY KEY)
DECLARE @Id dbo.IntList; INSERT @Id(Value) VALUES (2),(3; DECLARE @sql nvarchar(max) = N' SELECT * FROM temp_table where Id IN ( SELECT value FROM @Ids ); ' EXEC sp_executesql @sql, N'@Ids dbo.IntList', @Ids = @Id;
雖然不清楚為什麼在這裡需要動態 SQL,但也許這是一個最小的例子。