我需要在表格中的每个记录NVARCHAR(MAX)
字段上应用一个过程。该过程将接收一个大字符串并将其拆分为几个较短的字符串(少于100个字符)。该过程将返回较小字符串的结果集。这些字符串将插入到不同的表中(每个表都在自己的行中)。
如何以基于集合的方式将此过程应用于整个表,以便我可以将结果插入到另一个表中?
我有关于SO的found some similar个问题,但他们并不需要使用INSERT INTO
结构。这意味着UDF和TVF功能不在桌面上。 EDIT:函数不支持DML语句。我想在函数中使用INSERT INTO
。
或者,是否存在使用存储过程的基于集合的方法? SELECT sproc(Text) FROM Table
没有用。
答案 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;