在存储过程中使用带有IN子句的分隔符拆分函数

时间:2015-05-06 13:09:55

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

我在SQL Server Central找到了一个拆分字符串函数。

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

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

作为内联函数会更好吗并为我做一些不同的事情吗?

1 个答案:

答案 0 :(得分:0)

之前我有使用'split'功能的经验。唯一的问题是性能。查询优化器将估计行数远离现实。这是因为它不知道数据在“where in”条件下的样子。

在我的应用程序中,拆分后的结果超过2,000行 结果是超过100万条记录 查询使用'where in(从dbo.Splie(@types)中选择c1)'约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')