【问题标题】:Using delimiter split function with IN clause in a stored procedure在存储过程中使用带有 IN 子句的分隔符拆分函数
【发布时间】:2015-05-06 13:09:54
【问题描述】:

我在SQL Server Central 上发现了一个拆分字符串函数。

它是一个拆分分隔字符串的表值函数。我试图弄清楚这是否是为 IN 子句调用此类函数的最佳方法。

WHERE x.Type IN (SELECT Item FROM dbo.DelimitedSplit8K(@Types, ','))

作为内联函数会更好吗?对我有什么不同?

【问题讨论】:

  • 您只发布了部分查询,我们并不真正知道您要做什么。这似乎不是该功能的最佳用法,但在不了解您的要求的情况下很难说。
  • 最好的方法是在你的存储过程中使用一个表值参数,但是如果你想使用 split 函数,你就在正确的轨道上,它应该为你解决问题已经在做。
  • 你发帖的方式很好
  • 根据列表(和结果表)的大小,首先将函数的结果插入临时表可能是有益的,只是为了给优化器一个正确的基数 est
  • @dean 不是真的。对所有行计算一次

标签: sql sql-server stored-procedures split delimiter


【解决方案1】:

我以前有使用“拆分”功能的经验。唯一的问题是性能。查询优化器将估计离现实太远的行数。这是因为它不知道数据在您的“在哪里”条件下的样子。

在我的应用程序中拆分后的结果超过 2,000 行。
结果是超过 100 万条记录。
使用 'where in (select c1 from dbo.Splie(@types))' 的查询大约需要 15 分钟。使用如下所示的动态sql,估计行数更准确,处理查询时间不到5秒。

示例

create table #table (
    column1 nvarchar(60),
    column2 nvarchar(60)
)
insert into #table values
('A','X'),('B','Y'),('C','Z')

declare @Types nvarchar(max) = 'A,B,C'
set @Types = concat('''', replace(@Types, ',', ''','''), '''')

declare @result table
(
  column1 nvarchar(60)
)
declare @sql nvarchar(max)

select @sql = concat(
'select column2
 from #table t
 where t.column1 in (', @Types, ')'
)

insert into @result
exec sp_sqlexec @sql

select * from @result

drop table #table

下面的语句对优化器更友好

select column2
 from #table t
 where t.column1 in ('A','B','C')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2014-08-23
    • 2013-09-05
    • 1970-01-01
    • 2011-04-29
    • 2011-12-24
    相关资源
    最近更新 更多