我正在编写SQL存储过程。传递给存储过程的参数之一是列表(以逗号分隔的字符串)。
我知道如果我想在该列表中找到特定字符串,我可以使用类似SELECT * FROM myTable WHERE myField IN (@myList)
但是如果" myField"还包含一个列表(以逗号分隔的字符串)。如何检查" @ myList"匹配" myField"?
中列表中的任何值我正在使用 SQL Server 2014 SP1 ,如果这有任何区别。
答案 0 :(得分:1)
在解析器的帮助下......那里有很多。
Select *
From myTable
Where MyField in ( Select Key_Value from [dbo].[udf-Str-Parse](@myList,',') )
或者可以是加入
Select A.*
From myTable A
Join ( Select * from [dbo].[udf-Str-Parse](@myList,',') b
on A.MyField = B.Key_Value
我的解析器
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
-- Select * from [dbo].[udf-Str-Parse]('id26,id46|id658,id967','|')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1) NOT NULL , Key_Value varchar(max))
As
Begin
Declare @intPos int,@SubStr varchar(max)
Set @IntPos = CharIndex(@delimeter, @String)
Set @String = Replace(@String,@delimeter+@delimeter,@delimeter)
While @IntPos > 0
Begin
Set @SubStr = Substring(@String, 0, @IntPos)
Insert into @ReturnTable (Key_Value) values (@SubStr)
Set @String = Replace(@String, @SubStr + @delimeter, '')
Set @IntPos = CharIndex(@delimeter, @String)
End
Insert into @ReturnTable (Key_Value) values (@String)
Return
End