不使用游标和循环调用每一行的过程?

时间:2014-04-16 08:29:42

标签: sql sql-server-2008-r2

我需要在表格中的每个记录NVARCHAR(MAX)字段上应用一个过程。该过程将接收一个大字符串并将其拆分为几个较短的字符串(少于100个字符)。该过程将返回较小字符串的结果集。这些字符串将插入到不同的表中(每个表都在自己的行中)。

如何以基于集合的方式将此过程应用于整个表,以便我可以将结果插入到另一个表中?

我有关于SO的found some similar个问题,但他们并不需要使用INSERT INTO结构。这意味着UDF和TVF功能不在桌面上。 EDIT:函数不支持DML语句。我想在函数中使用INSERT INTO

或者,是否存在使用存储过程的基于集合的方法? SELECT sproc(Text) FROM Table没有用。

1 个答案:

答案 0 :(得分:1)

我不确定拆分字符串的确切逻辑,但如果可能的话,你可以使你的拆分功能成为内联TVF(我之前提到的那个):

CREATE FUNCTION dbo.Split(@StringToSplit NVARCHAR(MAX), @Delimiter NCHAR(1))
RETURNS TABLE
AS
RETURN
(   
    SELECT  Position = Number,
            Value = SUBSTRING(@StringToSplit, Number, CHARINDEX(@Delimiter, @StringToSplit + @Delimiter, Number) - Number)
    FROM    (   SELECT  TOP (LEN(@StringToSplit) + 1) Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
                FROM    sys.all_objects a
            ) n
    WHERE   SUBSTRING(@Delimiter + @StringToSplit + @Delimiter, n.Number, 1) = @Delimiter
);

然后,您可以通过使用与TVF的交叉应用在插入语句中使用它:

DECLARE @T1 TABLE (ID INT IDENTITY, TextToSplit NVARCHAR(MAX) NOT NULL);
DECLARE @T2 TABLE (T1ID INT NOT NULL, Position INT NOT NULL, SplitText NVARCHAR(MAX) NOT NULL);

INSERT @T1 (TextToSplit) 
VALUES ('This is a test'), ('This is Another Test');

INSERT @T2 (T1ID, Position, SplitText)
SELECT  t1.ID, s.Position, s.Value
FROM    @T1 t1
        CROSS APPLY dbo.Split(t1.TextToSplit, N' ') s;

SELECT  *
FROM    @T2;