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'
我需要创建一个存储过程来检查所有匹配不定数量值的记录。
例如采用以下简单语句;
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'