我正在使用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批,但我不确定如何防止这种情况。很感谢任何形式的帮助。谢谢!
答案 0 :(得分:1)
您正在创建一个名为@roles的表变量。
在游标中,你返回一个字段,我假设是varchar()。您不能获取光标的输出(varchar字段)并将其分配给表变量,它们是不同的类型
你可以做到
DECLARE @theRole VARCHAR(200)
FETCH NEXT FROM Member_Cursor into @theRole
INSERT INTO @roles (dbrole) VALUES (@theRole)
或类似的东西