【问题标题】:Using cursors in a stored procedure在存储过程中使用游标
【发布时间】:2013-01-27 08:23:11
【问题描述】:

这是我的存储过程:

CREATE PROCEDURE uspUpdateDataInBapMidTable (
   @companyName varchar(50)
)
AS
BEGIN
    SET @companyName = 'nürnberger'

    DECLARE @tableNameMid varchar(50) , @tableNameIn varchar(50) , @queryToCreateTable nvarchar (500) , @queryToAddColumn nvarchar(500)
    DECLARE @queryToUpdateBapMid nvarchar(500)
    SET @tableNameMid = 'BAP_'+@companyName+'_MID'
    SET @tableNameIn = 'BAP_'+@companyName+'_IN'
    DECLARE @COGI varchar (50)
    SET @COGI = ''

SET NOCOUNT ON
    DECLARE @collectionOfGesellschaft_id nvarchar(100)
    DECLARE myCursor cursor FOR
    SELECT distinct gesellschaft_id from CRM_Wifo_GmbH.dbo.vertrag_168 where gesellschaft like '%nürnberger%'

    open myCursor
    DECLARE @collectionOfGesellschaft_id1 nvarchar(100)

    set @collectionOfGesellschaft_id  = '('
    fetch next from myCursor into @collectionOfGesellschaft_id1
    while @@fetch_status = 0
    begin
    set @collectionOfGesellschaft_id = @collectionOfGesellschaft_id + @collectionOfGesellschaft_id1 + ' ,'

    fetch next from myCursor into @collectionOfGesellschaft_id1
    END
    set @collectionOfGesellschaft_id = SUBSTRING(@collectionOfGesellschaft_id,1,LEN(@collectionOfGesellschaft_id)-1) + ')'
    SET @COGI = @collectionOfGesellschaft_id
    CLOSE myCursor
    DEALLOCATE myCursor                         
    go

SET @queryToUpdateBapMid = N'select distinct b.*,v.vertrag_id,v.VersicherungsscheinNummer 
from CRM_Wifo_GmbH.dbo.vertrag_168 v,temp_universa b where v.VersicherungsscheinNummer like ''%'' + b.VSNR + ''%''  and v.gesellschaft_id in' + @COGI
EXEC(@queryToUpdateBapMid)

END

@companyName 是为我的测试目的而设置的。当我只执行光标时,它运行良好。但在存储过程中显示以下错误:

消息 102,级别 15,状态 1,过程 uspUpdateDataInBapMidTable,第 33 行
'myCursor' 附近的语法不正确。

消息 137,第 15 级,状态 2,第 3 行
必须声明标量变量“@COGI”。

消息 137,第 15 级,状态 2,第 4 行
必须声明标量变量“@queryToUpdateBapMid”。

我在 SP 的开头声明了这两个变量,但是它们显示了这个错误。这条线有什么问题

 DEALLCOATE myCursor

【问题讨论】:

    标签: sql-server-2008 stored-procedures cursor


    【解决方案1】:

    问题与 go 一词有关,就在 DEALLOCATE myCursor 行之后。

    GO 不是一般 SQL 或特定 Transact-SQL 的一部分。它是被 SQL Server Management Studio 或 sqlcmd 等工具识别为批处理分隔符的关键字。当遇到GO 时,您的脚本会在该点拆分,GO 之前的部分与它之后的部分分开执行。

    您的特定脚本中的go 会过早地拆分它。它基本上没有关闭最初的BEGIN,这实际上就是错误的原因,尽管,当然,该消息可能看起来有些混乱。

    无论如何,这是你的问题,所以,只需删除 go

    【讨论】:

    • 感谢您的回复。但我在 15 小时前自己整理过。
    • 是的,我来晚了,抱歉。 :) 很高兴你能自己解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2011-03-14
    相关资源
    最近更新 更多