将LIKE查询的参数列表传入存储过程

时间:2014-07-28 17:30:12

标签: sql sql-server tsql stored-procedures

我有一个我想查询的项目列表。问题是列表中的项目数不是恒定的。例如

select * from table1 where
field1 like @value1 + '%' OR
field1 like @value2 + '%'

我想将value1value2等作为逗号分隔的字符串或类似内容传递给存储过程。

2 个答案:

答案 0 :(得分:0)

如果您将每行中的值存储在一个表变量中,您只需JOIN或更好,请使用WHERE EXISTS

SELECT DISTINCT a.* 
FROM  Table1 a
WHERE EXISTS (SELECT 1
              FROM @Table2 b
              WHERE a.field1 like b.value + '%')

答案 1 :(得分:0)

这是一种可以将CSV传递给存储过程,将其转换为XML并在选择中的连接中使用它的方法。

将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

将以下内容放在存储过程中,@ Titles是一个参数而不是声明:

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