【问题标题】:SQL Server : select where with multiple valuesSQL Server:选择具有多个值的位置
【发布时间】:2015-02-21 06:21:05
【问题描述】:

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

因此例如采取以下简单的语句;

SELECT * 
FROM some_table 
WHERE ID = @param1

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

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

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

如果有人能告诉我如何做到这一点或想出更好的方法,我真的很感激。

【问题讨论】:

标签: sql-server tsql stored-procedures


【解决方案1】:

网上有很多拆分函数版本,如果你只是谷歌SQL Server拆分函数,你会得到100个结果。

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

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)
             )

程序

一个 proc 看起来像...

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 

【讨论】:

  • 此解决方案适用于 int 值。如果该字符串是一个字符串数组,那么它可能包含一些 XML 保留字符(例如 &)。此时从 string/varchar 到 XML 的转换将失败(例如DECLARE @param1 VARCHAR(100) = '1,&amp;2,45')。
  • true,但我认为 OP 只提到了用逗号分隔的 int 值,老实说,你上次是什么时候看到使用逗号分隔的特殊字符的查询 :) 不太可能的情况我猜。
  • 确实,OP 的示例仅使用数字,但没有提及值的类型。此外,有人可以尝试使用此方法发送[N][VAR]CHAR 值的数组。
  • @M.Ali 我选择你的作为答案是基于它与其他答案相比的简单性。你是对的,因为我只想在输入中使用数值。
【解决方案2】:

这个解决方案怎么样 - 使用 XML 查询。 过程中的表变量仅用于测试。

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'

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多