首页 > 解决方案 > SQL,一次性初始化游标,必须声明标量变量

问题描述

我正在使用游标一次用租户表中的所有租户填充一个表。我想确保在我的导航表中将tenantId 设置为General 名称。但由于某种原因,它认为我的变量没有设置。

我尝试了以下代码

**** 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 行 ';' 附近的语法不正确。

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

我的表的结构 在此处输入图像描述

任何帮助都感激不尽。罗德尼

标签: sql-server

解决方案


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

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

但是,除了上述内容之外,您go的中间不应该有 acursor并且您错过了一些方括号insert

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

应该

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

推荐阅读