遍历表行并在每一行上调用存储过程

时间:2018-06-08 06:38:34

标签: sql sql-server sql-server-2008

我目前面临的问题是,我必须循环遍历给定表的所有行,处理该行中列的值,并将处理后的结果与该行中的更多数据保存到新表中。

我的问题是我对那种sql语句并不那么坚定。任何人都可以给我一些tipps或流行语来使用吗?

也许某些伪代码(c#)会帮助您理解我的问题

$message->from('some.email@here.com', 'Put Your Name Here');

所以我想要实现的是一个新表,其中每行的处理值和来自该行的一些原始数据

3 个答案:

答案 0 :(得分:0)

通常,您希望在sql中搜索逐行语句(搜索RBAR),而是执行set操作。尝试类似:

Insert Into ResultTable (
    column1, 
    column2, 
    processedValue)
select 
    ot.column1, 
    ot.column2, 
    yourFunction(ot.column3) AS ProcessedValue
from 
    originalTable ot

答案 1 :(得分:0)

SQL Server中与C#foreach最接近的是CURSOR。这允许您对一组数据执行每行操作。但是,请谨慎使用游标。应尽可能避免使用它们,因为与通常在SQL查询中执行的基于集合的操作相比,它们的性能不佳。

如果可能,另一种替代方法是将用户定义的函数与CROSS APPLY or OUTER APPLY结合使用,如下所示:

SELECT TableRows.Column1, TableRows.Column2, func.ProcessedValue
FROM TableRows
CROSS APPLY dbo.fn_DataProcessingFunction(TableRows.ColumnToBeProcessed) AS func;

答案 2 :(得分:0)

从逻辑到你的伪代码,没有必要的循环,你可以使用标量函数,并像往常一样选择行

CREATE FUNCTION dbo.ProcessColumn (@Column)
RETURN NUMERIC
BEGIN
     --Your process here,
     --this is some example
    DECLARE @var numeric
    SET @var = @column + 1
    RETURN @var
END

然后将其应用于SELECT STATEMENT

INSERT INTO TABLE1 (Column1, Column2, ProcessedColumn)

SELECT Column1, Column2, 
 --this is your function, with column of the table
 -- as parameter to be processed
     dbo.ProcessColumn(Column3)
FROM TABLESOURCE