SQL,光标一次初始化,必须声明标量变量

时间:2018-08-07 11:17:55

标签: sql-server

我正在使用光标一次在表中填充租户表中的所有租户。我想确保将tenantId设置为导航表中的常规名称。但是出于某种原因,它认为未设置我的变量。

我尝试了以下代码

**** Script for SelectTopNRows command from SSMS  ******/

declare @tenantId int
declare @tenantName nvarchar(100)


DECLARE tenantCursor CURSOR FOR  
SELECT Id, [Name]   
FROM [dbo].[Tenant]


OPEN tenantCursor;  
FETCH NEXT FROM tenantCursor  INTO @tenantId, @tenantName;  
WHILE @@FETCH_STATUS = 0  
   BEGIN  

        print @tenantId
        print @tenantName
        SET @tenantId = @tenantId

        Insert INTO [dbo].Navigations ([Name, TenantId]) 
            VALUES ('Algemeen', @tenantId);

        GO

        FETCH NEXT FROM tenantCursor INTO @tenantId, @tenantName; 
   END;  
CLOSE tenantCursor;  
DEALLOCATE tenantCursor;  
GO

我遇到了以下错误:

第102条消息,第15级,状态1,第22行 ';'附近的语法不正确。

第137层15级州立2行26 必须声明标量变量“ @tenantId”。

我的桌子的结构 enter image description here

任何帮助将不胜感激。 罗德尼

1 个答案:

答案 0 :(得分:3)

简单的解决方案是仅以设计时使用的基于集合的方式使用SQL,然后运行以下命令而不是您的cursor

insert into dbo.Navigations ([Name]
                            ,TenantId
                            ) 
select 'Algemeen'
      ,Id
from dbo.Tenant;

但是,除上述以外,您go的中间不应有cursor,并且您会错过insert上的一些方括号:

Insert INTO [dbo].Navigations ([Name, TenantId])

应该是

Insert INTO [dbo].Navigations ([Name], [TenantId])