我在SQL Server Central找到了一个拆分字符串函数。
它是一个表值函数,用于分割分隔的字符串。我试图弄清楚这是否是为IN子句调用这样的函数的最佳方法。
WHERE x.Type IN (SELECT Item FROM dbo.DelimitedSplit8K(@Types, ','))
作为内联函数会更好吗并为我做一些不同的事情吗?
答案 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')