我将一个分隔的字符串发送到“存储过程”'最终将与IN语句一起使用来更新一些记录,因此我要做的是创建一个表值函数'这将执行此转换并返回此表,该表将在此更新语句中使用,但我不确定如何执行此操作。
还有另一个函数可以分解分隔的字符串,但它不喜欢它返回整个表格,我真的不明白它的sytax,它不是我之前遇到过的任何sql ......
所以(在下面的其他函数中发布)我可以修改或使用此函数为此分隔字符串中的任意数量的值,或者我是否需要提出另一种方法?
CREATE FUNCTION [dbo].[Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
使用此功能时,会使用以下语法获取每个项目
set @ID = (select Data from dbo.Split(@Params, '|') where ID = 1)
*****来自答案的结果更新*******
DECLARE @pVals VARCHAR(MAX)
SET @pvals = '1,2,3,4,5'
DECLARE @tblDelimitedData TABLE (
[Data] INT NULL
)
INSERT INTO @tblDelimitedData(data)
SELECT data
FROM dbo.Split(@pvals, ',') s
WHERE ID >= 2
SELECT * FROM @tblDelimitedData
结果为2,3,4,5
非常感谢!!
答案 0 :(得分:1)
要将函数的结果插入临时表,您应该使用:
INSERT INTO #tempTable(data)
SELECT data
FROM dbo.Split(@Params, '|') s
WHERE ID = 1
但是,使用WHERE ID = 1
仅插入分隔列表中的第一个项目。如果要过滤,那么要在表格中插入的值的数量使用<=
。
例如,您只想插入前三个值,然后使用:
WHERE ID <= 3
此外,与其他一些可用功能相比,您的分割功能较慢。我建议您使用基于Tally的分割器,例如Jeff Moden DelimitedSplit8K。