将分隔的字符串分解为临时表

时间:2016-06-01 07:19:45

标签: sql tsql

我将一个分隔的字符串发送到“存储过程”'最终将与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

非常感谢!!

1 个答案:

答案 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