Sql-Server

使用 IN 語句執行 SQL 查詢

  • June 15, 2022

我沒有得到正確的結果

以下是我的表格值: 在此處輸入圖像描述

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

SQL小提琴

我無法得到結果。有人可以幫我弄這個嗎?

我知道只有單引號有一些錯誤,我嘗試了很多方法但沒有得到結果。

http://sqlfiddle.com/#!18/a400f/1

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,但也許這是一個最小的例子。

引用自:https://dba.stackexchange.com/questions/313319