解析逗号分隔的字符串以在Where子句中生成IN字符串列表

我的存储过程收到一个参数,该参数是逗号分隔的字符串:


DECLARE @Account AS VARCHAR(200)

SET @Account = 'SA,A'

我需要从中作出这样的陈述:


WHERE Account IN ('SA', 'A')

最佳做法是什么?


蝴蝶不菲
浏览 713回答 3
3回答

心有法竹

创建此函数(sqlserver 2005+)CREATE function [dbo].[f_split](@param nvarchar(max),&nbsp;@delimiter char(1))returns @t table (val nvarchar(max), seq int)asbeginset @param += @delimiter;with a as(select cast(1 as bigint) f, charindex(@delimiter, @param) t, 1 sequnion allselect t + 1, charindex(@delimiter, @param, t + 1), seq + 1from awhere charindex(@delimiter, @param, t + 1) > 0)insert @tselect substring(@param, f, t - f), seq from aoption (maxrecursion 0)returnend使用此语句SELECT *FROM yourtable&nbsp;WHERE account in (SELECT val FROM dbo.f_split(@account, ','))比较我的split函数和XML split:测试数据:select top 100000 cast(a.number as varchar(10))+','+a.type +','+ cast(a.status as varchar(9))+','+cast(b.number as varchar(10))+','+b.type +','+ cast(b.status as varchar(9)) txt into a&nbsp;from master..spt_values a cross join master..spt_values bXML:&nbsp;SELECT count(t.c.value('.', 'VARCHAR(20)'))&nbsp;FROM (&nbsp; &nbsp; &nbsp;SELECT top 100000 x = CAST('<t>' +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;REPLACE(txt, ',', '</t><t>') + '</t>' AS XML)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;from a&nbsp;) a&nbsp;CROSS APPLY x.nodes('/t') t(c)Elapsed time: 1:21 secondsf_split:select count(*) from a cross apply clausens_base.dbo.f_split(a.txt, ',')Elapsed time: 43 seconds这会随着时间的流逝而变化,但是您会明白

慕田峪7331174

最有效的方法是对拆分字符串使用CLR函数。请参阅本文以获取示例和性能比较
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server