Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将LIKE查询的参数列表传入存储过程_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

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