在存储过程中使用游标

时间:2013-01-27 08:23:12

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

这是我的存储过程:

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用于我的测试目的。当我只执行游标时,它运行正常。但是在存储过程中它显示了以下错误:

  

Msg 102,Level 15,State 1,Procedure uspUpdateDataInBapMidTable,Line 33
  'myCursor'附近的语法不正确。

     

Msg 137,Level 15,State 2,Line 3
  必须声明标量变量“@COGI”。

     

Msg 137,Level 15,State 2,Line 4
  必须声明标量变量“@queryToUpdateBapMid”。

我在SP的开头声明了这两个变量,但它们显示了这个错误。行

有什么问题
 DEALLCOATE myCursor

1 个答案:

答案 0 :(得分:1)

问题与go行后面的DEALLOCATE myCursor一词有关。

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

特定脚本中的go过早地将其拆分。它基本上使初始的BEGIN保持未闭合状态,这实际上就是错误的内容,尽管如此,该消息可能看起来有些令人困惑。

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

相关问题