SQL - 使用 select 语句和循环来填充存储过程
Posted
技术标签:
【中文标题】SQL - 使用 select 语句和循环来填充存储过程【英文标题】:SQL - Using a select statement and loop to populate a stored procedure 【发布时间】:2014-12-15 12:42:40 【问题描述】:我必须使用存储过程来更新某些字段。 sp 看起来像这样:
exec dbo.spMaintainConditionComponent
@Mask = 16
,@ConditionComponentUID =
,@Status = 1
,@ArchiveUser = ''
,@ArchiveDate = ''
,@ArchiveReason = 'Removed'
,@ArchiveTypeID = '464'
除@ConditionComponentUID 可以从此选择代码中获取之外,所有参数的值都相同:
SELECT tbConditionComponent.ConditionComponentUID
FROM tbAsset INNER JOIN
tbConditionComponent ON tbAsset.AssetUID = tbConditionComponent.ParentID
WHERE (tbAsset.Status = 1)
我还需要使用“while 循环”或“光标”,因为不能同时更新多个记录。请问有人可以帮忙吗?
【问题讨论】:
如果你在存储过程中选择@ConditionComponentUID
,为什么你声明是作为参数传递?而不是在程序中选择它
为什么不能同时更新多条记录?
使用游标或while循环会减慢执行速度。
这不是我的程序,所以我无法操纵它来包含选择。无法运行多条记录,因为有一个单独的审计跟踪表不允许我这样做。我不担心时间只要可以实现,这是一次性的练习。
创建表类型并将其传递给过程。您可以在单个过程调用中进行更新
【参考方案1】:
有很多方法可以更新数据。最糟糕的是“使用循环”。如果您别无选择使用光标循环遍历值:
DECLARE LoopCursor CURSOR FOR
SELECT tbConditionComponent.ConditionComponentUID
FROM tbAsset INNER JOIN tbConditionComponent ON tbAsset.AssetUID = tbConditionComponent.ParentID
WHERE (tbAsset.Status = 1)
DECLARE @ConditionComponentUIDTemp AS UNIQUEIDENTIFIER
OPEN LoopCursor
FETCH NEXT FROM LoopCursor INTO @ConditionComponentUIDTemp
WHILE @@FETCH_STATUS = 0
BEGIN
exec dbo.spMaintainConditionComponent
@Mask = 16
,@ConditionComponentUID = @ConditionComponentUIDTemp
,@Status = 1
,@ArchiveUser = ''
,@ArchiveDate = ''
,@ArchiveReason = 'Removed'
,@ArchiveTypeID = '464'
FETCH NEXT FROM LoopCursor INTO @ConditionComponentUIDTemp
END
CLOSE LoopCursor
DEALLOCATE LoopCursor
【讨论】:
谢谢,但运行时出现以下错误:Msg 16922, Level 16, State 1, Line 9 Cursor Fetch: Implicit conversion from data type uniqueidentifier to int is not allowed. tbConditionComponent.ConditionComponentUID的数据类型是什么 然后将变量ConditionComponentUIDTemp类型改为uniqueidentifier。我更新了代码 谢谢,现在试一试以上是关于SQL - 使用 select 语句和循环来填充存储过程的主要内容,如果未能解决你的问题,请参考以下文章
从 Java 到 Oracle SQL 的翻译:将每个元素作为 SELECT 语句的结果使用到循环中[关闭]