我有用户列表,所有用户都会在使用域名识别的服务器上进行处理,我有临时表,其中Ian从cab文件加载我的用户。 我需要根据临时文件中的记录创建用户
如何使用游标创建此记录?
我正在尝试
DECLARE cursor1 CURSOR
FOR
SELECT *
FROM #temp;
OPEN cursor1
FETCH NEXT
FROM cursor1
INTO @userprofile
WHILE @@fetch_status = 0
BEGIN
CREATE user @userprofile
FOR LOGIN @userprofile GO
EXEC sp_addrolemember 'role'
,@userprofile
FETCH NEXT
FROM cursor1
INTO @userprofile
END
CLOSE cursor1
DEALLOCATE cursor1
但是它给我一个错误
Msg 102 Incorrect syntax near @userprofile and msg 137 must declare the scalar variable @userprofile
答案 0 :(得分:1)
通过调用CREATE USER等命令,不能将内联变量用作对象名。您需要执行类似的操作并使用动态SQL:
编辑 - 在此示例中,您还可以使用sp_adduser而不是动态sql。但是,自SQL Server 2012起,此存储过程已被弃用。因此,如果您使用上述版本,请坚持使用动态sql和CREATE USER命令。
SQL2012或更高版本的动态SQL
DECLARE @UserProfile VARCHAR(20)
DECLARE cursor1 CURSOR
FOR
SELECT
*
FROM #temp;
OPEN cursor1
FETCH NEXT FROM cursor1 INTO @UserProfile
WHILE @@Fetch_Status = 0
BEGIN
DECLARE @Sql VARCHAR(MAX)
SET @Sql = 'Create user ' + @UserProfile + ' for login ' + @UserProfile
--PRINT @SQL
EXEC (@Sql)
EXEC sp_addrolemember 'role'
,@UserProfile
FETCH NEXT FROM cursor1 INTO @UserProfile
END
CLOSE cursor1
DEALLOCATE cursor1
sp_adduser if prior:
EXEC sys.sp_adduser @LogInAme = @UserProfile
,@Name_In_Db = @UserProfile
我已经注释掉了PRINT声明。但是,如果你取消注释它。您可以从光标中看到它创建的命令。