SQL无法在过程中使用多个批次重新声明游标内的变量

时间:2014-04-19 21:06:09

标签: sql-server-2008 tsql

我正在使用Microsoft的Server Management Studio 2012以及他们的SQL Server 2008.我正在尝试扮演角色(CustomerRole)并获得该角色的所有用户,将用户放入表变量(@Roles) )并使用MemberName“列”存储其登录名。最终,我将使用此信息来完全删除用户,他们的登录以及最终的角色。

CREATE PROC dropLogins
    AS
DECLARE @Roles AS Table(DbRole varchar(20), MemberName varchar(50), MemberSID varchar(50))
INSERT INTO @Roles
EXEC sp_HelpRoleMember CustomerRole

DECLARE Member_Cursor CURSOR
DYNAMIC
FOR
SELECT DISTINCT MemberName
FROM @Roles
EXEC sp_HelpRoleMember CustomerRole
    OPEN Member_Cursor
    FETCH NEXT FROM Member_Cursor
    INTO @Roles --NOT DECLARED*
    WHILE @@FETCH_STATUS = 0
        ALTER ROLE CustomerRole DROP MEMBER MemberName
    FETCH NEXT FROM Member_Cursor
    INTO @Roles --NOT DECLARED*
CLOSE Member_Cursor
DEALLOCATE Member_Cursor

问题出现在状态为--NOT DECLARED*的区域。我收到“必须声明标量变量”@Roles“。”这两个地区的错误,虽然我不知道如何解决这个错误。我知道错误最有可能是由于代码被分成2批和3批,但我不确定如何防止这种情况。很感谢任何形式的帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

您正在创建一个名为@roles的表变量。

在游标中,你返回一个字段,我假设是varchar()。您不能获取光标的输出(varchar字段)并将其分配给表变量,它们是不同的类型

你可以做到

DECLARE @theRole VARCHAR(200)

FETCH NEXT FROM Member_Cursor into @theRole
INSERT INTO @roles (dbrole) VALUES (@theRole)

或类似的东西