Sql 如果解决方案是在供应商的应用程序之外构建的,则由于触发器、嵌套的过程、被操作的记录数量等原因,有很多障碍需要清除。由于应用程序的复杂性,这是最佳选择的许多倍,就是简单地用光标浏览记录。您在声明后错过了“open cur”-这给了我“光标未打开”错误。我没有

Sql 如果解决方案是在供应商的应用程序之外构建的,则由于触发器、嵌套的过程、被操作的记录数量等原因,有很多障碍需要清除。由于应用程序的复杂性,这是最佳选择的许多倍,就是简单地用光标浏览记录。您在声明后错过了“open cur”-这给了我“光标未打开”错误。我没有,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,如果解决方案是在供应商的应用程序之外构建的,则由于触发器、嵌套的过程、被操作的记录数量等原因,有很多障碍需要清除。由于应用程序的复杂性,这是最佳选择的许多倍,就是简单地用光标浏览记录。您在声明后错过了“open cur”-这给了我“光标未打开”错误。我没有代表做编辑。你可以通过投票来感谢人们的评论。谁知道呢,也许那样的话,下次他们会让销售代表来做编辑!:-)确保在存储过程中使用的字段中检查联接索引和WHERE子句。在添加适当的索引后,我大大加快了在循环中调用SP的速度。感谢您提醒我使用temp


如果解决方案是在供应商的应用程序之外构建的,则由于触发器、嵌套的过程、被操作的记录数量等原因,有很多障碍需要清除。由于应用程序的复杂性,这是最佳选择的许多倍,就是简单地用光标浏览记录。您在声明后错过了“open cur”-这给了我“光标未打开”错误。我没有代表做编辑。你可以通过投票来感谢人们的评论。谁知道呢,也许那样的话,下次他们会让销售代表来做编辑!:-)确保在存储过程中使用的字段中检查联接索引和WHERE子句。在添加适当的索引后,我大大加快了在循环中调用SP的速度。感谢您提醒我使用temp table以避免因长时间执行而导致的潜在锁定问题。有时,存储过程太大或太复杂,无法内联,而不冒引入错误的风险。在性能不是最高优先级的情况下,在游标循环中执行SP通常是最实际的选择。OP:“以某种方式更改用户数据的存储过程”:用户定义的函数不能用于执行修改数据库状态的操作。然而,SQLSVR 2014似乎没有问题
declare @field1 int
declare @field2 int
declare cur CURSOR LOCAL for
    select field1, field2 from sometable where someotherfield is null

open cur

fetch next from cur into @field1, @field2

while @@FETCH_STATUS = 0 BEGIN

    --execute your sproc on each row
    exec uspYourSproc @field1, @field2

    fetch next from cur into @field1, @field2
END

close cur
deallocate cur
Declare @TableUsers Table (User_ID, MyRowCount Int Identity(1,1)
Declare @i Int, @MaxI Int, @UserID nVarchar(50)

Insert into @TableUser
Select User_ID
From Users 
Where (My Criteria)
Select @MaxI = @@RowCount, @i = 1

While @i <= @MaxI
Begin
Select @UserID = UserID from @TableUsers Where MyRowCount = @i
Exec prMyStoredProc @UserID
Select

 @i = @i + 1, @UserID = null
End
SELECT udfMyFunction(user_id), someOtherField, etc FROM MyTable WHERE WhateverCondition
declare @cadena varchar(max) = ''
select @cadena = @cadena + 'exec spAPI ' + ltrim(id) + ';'
from sysobjects;
exec(@cadena);
Declare @SQL nvarchar(max);
-- Set SQL Variable
-- Prepare exec command for each distinctive tenantid found in Machines 
SELECT @SQL = (Select distinct 'exec dbo.sp_S2_Laser_to_cache ' + 
              convert(varchar(8),tenantid) + ';' 
              from Dim_Machine
              where iscurrent = 1
              FOR XML PATH(''))

--for debugging print the sql 
print @SQL;

--execute the generated sql script
exec sp_executesql @SQL;
DECLARE @menus AS TABLE (
    id INT IDENTITY(1,1),
    parent NVARCHAR(128),
    child NVARCHAR(128));
INSERT INTO @menus (parent, child) 
  VALUES ('Some name',  'Child name');
...
INSERT INTO @menus (parent,child) 
  VALUES ('Some other name', 'Some other child name');
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
WHILE @id IS NOT NULL
BEGIN
    SELECT @parentName = parent,
           @childName = child 
        FROM @menus WHERE id = @id;

    EXEC myProcedure @parent=@parentName, @child=@childName;

    SELECT @id = MIN(id) FROM @menus WHERE id > @id;
END
WHILE EXISTS(SELECT 1 FROM @menuIDs) 
BEGIN
    SELECT TOP 1 @menuID = menuID FROM @menuIDs;

    EXEC myProcedure @menuID=@menuID;

    DELETE FROM @menuIDs WHERE menuID = @menuID;
END;