Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用SQL中的任何东西替换存储过程的迭代执行?_Sql_Sql Server_Tsql_Stored Procedures_While Loop - Fatal编程技术网

如何用SQL中的任何东西替换存储过程的迭代执行?

如何用SQL中的任何东西替换存储过程的迭代执行?,sql,sql-server,tsql,stored-procedures,while-loop,Sql,Sql Server,Tsql,Stored Procedures,While Loop,有一种场景,其中SP在WHILE循环中执行。我想要一个解决方案,可以防止SP的迭代执行,但同时得到完全相同的结果。 下面的代码片段可能就是一个例子。考虑SP USPMYPROC正在根据所获得的参数更新表。 DECLARE @table TABLE ( id INT IDENTITY , Value INT ) DECLARE @counter INT = 1 , @maxcount INT , @value INT INSERT INTO @tabl

有一种场景,其中SP在WHILE循环中执行。我想要一个解决方案,可以防止SP的迭代执行,但同时得到完全相同的结果。 下面的代码片段可能就是一个例子。考虑SP USPMYPROC正在根据所获得的参数更新表。
DECLARE @table TABLE
    (
      id INT IDENTITY
    , Value INT
    )
DECLARE @counter INT = 1
  , @maxcount INT
  , @value INT
INSERT  INTO @table
VALUES  ( 1 ),
        ( 11 ),
        ( 3 ),
        ( 23 ),
        ( 2 )

SELECT  @maxcount = COUNT(*)
FROM    @table

WHILE @counter <= @maxcount
    BEGIN
        SELECT  @value = Value
        FROM    @table
        WHERE   id = @counter

        EXECUTE uspMyProc @id = @value

        SET @counter = @counter + 1
    END
DECLARE@table
(
id整型标识
,Value INT
)
声明@counter INT=1
,@maxcount INT
,@value INT
插入@table
价值观(1),
( 11 ),
( 3 ),
( 23 ),
( 2 )
选择@maxcount=COUNT(*)
来自@table

而@counter可以显示
uspMyProc
的代码吗?如果可以将其转换为接受一个值表而不是单个值,那么整个操作都可以基于设置,并且可以消除迭代。uspMyProc大约有2000行代码,因此无法在此处显示。但在这个例子中,它的代码非常复杂,最终需要更新表。是的,正如Zohar Peled所说,这可以在sp本身中以基于集合的方式完成。您需要处理sp中要处理的参数列表。您不能单纯从“调用”端解决它。您必须更改存储过程本身。