Sql 将LIKE查询的参数列表传入存储过程
我有一个要查询的项目列表。问题是列表中的项目数量不是恒定的。比如说Sql 将LIKE查询的参数列表传入存储过程,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我有一个要查询的项目列表。问题是列表中的项目数量不是恒定的。比如说 select * from table1 where field1 like @value1 + '%' OR field1 like @value2 + '%' 我想将value1、value2等作为逗号分隔的字符串或类似的内容传递到存储过程中。如果您在表变量中每行存储一个值,您可以简单地联接,或者更好地使用WHERE EXISTS: 下面是一种方法,您可以将CSV传递到存储的进程,将其转换为XML,并在select中的联接
select * from table1 where
field1 like @value1 + '%' OR
field1 like @value2 + '%'
我想将value1、value2等作为逗号分隔的字符串或类似的内容传递到存储过程中。如果您在表变量中每行存储一个值,您可以简单地联接,或者更好地使用WHERE EXISTS:
下面是一种方法,您可以将CSV传递到存储的进程,将其转换为XML,并在select中的联接中使用它 用于将CSV转换为XML的函数:
create function udf_CsvToXML(@Csv as varchar(8000),@Delim as varchar(15)=',')
returns xml
as
begin
declare @xml as xml = CAST('<XML>'+('<X>'+REPLACE(@Csv,@Delim,'</X><X>')+'</X></XML>') AS XML)
return @xml
end
你试过什么?您可以研究动态sql来实现这一点。根据实际返回的全文索引的性质,另一个选项似乎涵盖了所有选项。这在Linq中很容易实现,但性能并不理想。我认为存储过程可能有更好的性能。一种方法是使用表值参数,而不是使用逗号分隔的字符串等。
create function udf_CsvToXML(@Csv as varchar(8000),@Delim as varchar(15)=',')
returns xml
as
begin
declare @xml as xml = CAST('<XML>'+('<X>'+REPLACE(@Csv,@Delim,'</X><X>')+'</X></XML>') AS XML)
return @xml
end
declare @Titles varchar(8000) = NULL
SET @Titles = ISNULL(@Titles, 'ALL')
DECLARE @TitlesXML as XML
if upper(@Titles) = 'ALL'
SET @TitlesXML = (select distinct Title as X from LegalConfiguration for xml path(''), root('XML'))
else
SET @TitlesXML = dbo.udf_CsvToXML(@Titles,',')
select Title
from MonthlyTitlePerformance p
join (SELECT N.value('.[1]', 'varchar(25)') as value FROM @TitlesXML.nodes('/XML/X') as T(N)) tt
on tt.value = p.Title