Sql 在不使用游标和循环的情况下为每行调用过程?

Sql 在不使用游标和循环的情况下为每行调用过程?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我需要对表中每个记录的NVARCHAR(MAX)字段应用一个过程。该过程将接收一个大字符串,并将其拆分为几个较短的字符串(少于100个字符)。该过程将返回一个较小字符串的结果集。这些字符串将被插入到不同的表中(每一行) 如何以基于集合的方式将此过程应用于整个表,以便将结果插入到另一个表中 我有这样的问题,但是他们不需要在结构中使用插入。这意味着UDF和TVF功能已不再适用编辑:函数不支持DML语句。我想在函数内部使用INSERT-INTO 或者,是否有使用存储过程的基于集合的方法从表中选择存储过

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

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

我有这样的问题,但是他们不需要在结构中使用
插入。这意味着UDF和TVF功能已不再适用编辑:函数不支持DML语句。我想在函数内部使用
INSERT-INTO


或者,是否有使用存储过程的基于集合的方法<代码>从表中选择存储过程(文本)
不起作用。

我不确定拆分字符串的确切逻辑,但如果可能,您可以将拆分函数设置为内联TVF(这里是我之前制作的):

然后,您可以简单地在insert语句中使用它,方法是使用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;

您可以将top 1拆分(文本)与递归CTE相结合,生成最终可以插入到另一个表中的列表。最终,这将是一个非常酷的问题——但在你欣赏完它之前,你的脑袋会爆炸虽然CTE很酷,但我想我会在最后循环它:)如果我说的是显而易见的,请原谅,但不要忘记,对于大型数据集,标准的“While”比使用光标更快。诅咒者是邪恶的!您可以使用将多个记录传递给一个过程,但除非您可以将分割过程设置为基于过程而不是基于过程,否则我怀疑这只是将循环移动到该过程,而不是实际将其完全删除。@AnthonyHorne a while循环不一定比光标快,这是一个神话。我认为人们使用了错误的光标类型传播了这个神话,即,如果您只需要向前移动,并且只需要从光标读取,那么将其声明为
FORWARD\u only read\u only
,以减少开销。为了进一步阅读,哦,我明白了。我不需要也不想在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;