【问题标题】:Pass in list of parameters for LIKE query into stored procedure将 LIKE 查询的参数列表传入存储过程
【发布时间】:2023-03-21 20:42:01
【问题描述】:

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

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

我想将value1value2 等以逗号分隔的字符串或类似的形式传递到存储过程中。

【问题讨论】:

  • 你试过什么?您可以查看动态 sql 以实现此目的。根据您实际返回的内容的性质,全文索引可能是另一种选择
  • This answer 似乎涵盖了所有选项。
  • 这在 Linq 中很容易实现,但性能却不尽如人意。我认为存储过程可能有更好的性能。
  • 一种方法是使用表值参数而不是使用逗号分隔的字符串等。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

这是一种您可以将 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

【讨论】:

    【解决方案2】:

    如果您在表变量中每行存储一个值,您可以简单地使用JOIN,或者更好的是,使用WHERE EXISTS

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

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 2017-12-29
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多