在SQL中,您可以将1个具有多个值的变量设置为创建多个用户吗?

时间:2019-03-14 15:56:28

标签: sql loops tsql variables

我想知道是否可以制作一个简单而又快速的T-SQL脚本来编辑数据库以创建用户,这对于不同的人来说是有效的。我的示例将意味着每次循环遍历一个获得不同值的变量。

例如,我希望以下内容:

  1. 使用数据库DBNAME1
  2. 声明@User,有多个用户
  3. 创建要运行的SQL命令(即创建用户并应用其角色)
  4. 仅在用户不存在时应用它们

这是一个示例脚本,如果我要添加1个用户,则可以使用,但是我想使用此简化版本或类似版本添加多个用户,因此人们只需要在1个区域中添加一个名称列表? >

USE DBNAME1
GO
Declare @User NVARCHAR (30) = 'Domain\Username1', 'Domain\Username2', 'Domain\Username3' etc.

Declare @CMD NVARCHAR (90) = 'CREATE USER "' + @User +'" FOR LOGIN "' + @User + '"'
Declare @CMD2 NVARCHAR (90) ='ALTER ROLE [db_owner] ADD MEMBER [' + @User + ']'

if not exists(select name from sys.database_principals where name = @User)
    Begin   exec(@cmd) exec(@cmd2)  End
        ELSE
    Begin   Print '['+ @User +'] Exists'    END

上面的内容给出了以下错误:

  

第15层,状态1,第3行,消息102

     

“ domain \ Username2”附近的语法不正确。

     

第137条消息,第2级,第5行,第5行

     

必须声明标量变量“ @User”。

     

第137条消息,状态2,第6行,第6行

     

必须声明标量变量“ @User”。

     

第137条消息,第2级,第8行,第8行

     

必须声明标量变量“ @User”。

     

第13级州立2行9的消息137

     

必须声明标量变量“ @cmd”。

     

第13级州立2行9的消息137

     

必须声明标量变量“ @ cmd2”。

     

第13级州立2行11的消息137

     

必须声明标量变量“ @User”。

是否有可能做到这一点,因为它会使事情变得更好用?

1 个答案:

答案 0 :(得分:2)

您可以使用表变量来存储用户名。

DECLARE @Users TABLE(Username VARCHAR(64))

INSERT INTO @Users(Username) VALUES('Domain\Username1')
INSERT INTO @Users(Username) VALUES('Domain\Username2')

DECLARE @Username AS VARCHAR(64)

DECLARE C_Users CURSOR FOR
    SELECT Username FROM @Users

OPEN C_Users
FETCH NEXT FROM C_Users INTO @Username

WHILE @@FETCH_STATUS = 0
BEGIN

    IF NOT EXISTS(SELECT name FROM sys.database_principals WHERE name = @Username)
    BEGIN
        EXEC('CREATE USER [' + @Username + '] FOR LOGIN [' + @Username + ']')
        EXEC('ALTER ROLE [db_owner] ADD MEMBER [' + @Username + ']')
        PRINT '['+ @Username +'] created'
    END
    ELSE
    BEGIN
        PRINT '['+ @Username +'] already exists'
    END

    FETCH NEXT FROM C_Users INTO @Username

END

CLOSE C_Users
DEALLOCATE C_Users