SQL 服务器:select 其中有多个值

SQL Server : select where with multiple values

我需要创建一个存储过程来检查所有匹配不定数量值的记录。

例如采用以下简单语句;

SELECT * 
FROM some_table 
WHERE ID = @param1

但是,@param1 应该能够获取一串以逗号分隔的值并检查所有这些值,例如:

@param1 = '1,2,45,16,476,324,'

我想这需要获取这些值,然后将它们变成一个临时 table,然后以某种方式创建一个子查询来检查临时 table 中的所有值。然而,我的 T-SQL 技能还不足以独自解决这个问题。

如果有人能告诉我如何做或想出更好的方法,我将不胜感激。

网上有很多split function版本,如果你只是google SQL Server Split function你会得到100s的结果。

没有函数的快速修复看起来像……

DECLARE @param1 VARCHAR(100) = '1,2,45,16,476,324'       
DECLARE @param1XML xml;


SELECT @param1XML = CONVERT(xml,' <root> <s>' 
                    + REPLACE(@param1, ',','</s> <s>') 
                    + '</s>   </root> ')

SELECT * 
FROM some_table 
WHERE ID IN (
             SELECT T.c.value('.','varchar(20)') AS Value
             FROM @param1XML.nodes('/root/s') T(c)
             )

程序

一个过程看起来像...

CREATE PROCEDURE dbo.usp_SomeProc 
  @param1 VARCHAR(100)
AS
BEGIN
   SET NOCOUNT ON;
  DECLARE @param1XML xml; 

 SELECT @param1XML = CONVERT(xml,' <root> <s>' 
                    + REPLACE(@param1, ',','</s> <s>') 
                    + '</s>   </root> ')

    SELECT * 
    FROM some_table 
    WHERE ID IN (
    SELECT  T.c.value('.','varchar(20)')  AS Value
    FROM @param1XML.nodes('/root/s') T(c))

END 

这个解决方案怎么样 - 使用 XML 查询。 Table 程序中的变量仅为测试而创建。

CREATE PROCEDURE dbo.spTestDelimitedParam 
(
  @param1 as varchar(max)
)
AS
BEGIN
  DECLARE @xml as xml
  DECLARE @delimiter as char(1)
  DECLARE @test table (id int, description varchar(20))

  insert into @test 
  values (1, 'Row ID = 1'), (11, 'Row ID = 11'), (3, 'Row ID = 3')

  SET @delimiter =','
  SET @xml = cast(('<X>'+replace(@param1,@delimiter ,'</X><X>')+'</X>') as xml)
  SELECT * 
  FROM @test 
  WHERE ID IN (SELECT N.value('.', 'int') as value FROM @xml.nodes('X') as T(N))
END

工作原理:

exec dbo.spTestDelimitedParam '1,23,4,11,24456'