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 语句和循环来填充存储过程的主要内容,如果未能解决你的问题,请参考以下文章

SQL SELECT 语句根据 WHERE 语句跳过行

Ninja 表单使用 SQL/PHP 填充 Select

从 Java 到 Oracle SQL 的翻译:将每个元素作为 SELECT 语句的结果使用到循环中[关闭]

SQL SELECT、CASE、BETWEEN INTO 语句

oracle 中字段作为变量的语句怎么写

sql写语句如何循环执行10000次