\和GO中带有用户创建循环的语法不正确

时间:2019-02-14 01:12:01

标签: sql loops login

我遇到了反斜杠和动态sql exec语法问题,并且想知道最简单的方法是更正此循环以表示\以及在下面的用户登录创建时动态sql中出现的其他特殊字符循环:

DECLARE @Domain AS VARCHAR(50) = 'WidgetFactory\'
DECLARE @BasicNameList as VARCHAR(MAX) = 'user1,user2,user3'
DECLARE @NAME AS VARCHAR(50)
DECLARE @Query AS NVARCHAR(MAX)

WHILE LEN(@BasicNameList) > 0
BEGIN
    SET @NAME = LEFT(@BasicNameList, charindex(',', @BasicNameList+',')-1)

    SET @Query =   'If not Exists (select loginname from master.dbo.syslogins 
                        where name = ' + @Domain + @NAME + ' and dbname = ''master'')
                    Begin
                        USE [master]
                        GO
                        CREATE LOGIN [' + @Domain + @NAME + '] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
                        GO
                        ALTER SERVER ROLE [BasicDBA] ADD MEMBER [' + @Domain + @NAME + ']
                        GO
                        USE [DB1]
                        GO
                        CREATE USER [' + @Domain + @NAME + '] FOR LOGIN [' + @Domain + @NAME + ']
                        GO
                        USE [DB1]
                        GO
                        ALTER ROLE [db_datareader] ADD MEMBER [' + @Domain + @NAME + ']
                        GO
                        USE [DB2]
                        GO
                        CREATE USER [' + @Domain + @NAME + '] FOR LOGIN [' + @Domain + @NAME + ']
                        GO
                        USE [DB2]
                        GO
                        ALTER ROLE [db_datareader] ADD MEMBER [' + @Domain + @NAME + ']
                        GO
                        USE [master]
                        GO
                        CREATE USER [' + @Domain + @NAME + '] FOR LOGIN [' + @Domain + @NAME + ']
                        GO
                        USE [master]
                        GO
                        ALTER ROLE [db_datareader] ADD MEMBER [' + @Domain + @NAME + ']
                        GO                      
                    END'

    EXEC(@Query)

  SET @BasicNameList = STUFF(@BasicNameList, 1, CHARINDEX(',', @BasicNameList+','), '')
END

1 个答案:

答案 0 :(得分:0)

问题不是反斜杠。问题似乎是LAST在动态sql中无效。也许您可以更改脚本以在自己的事务中执行每个语句?

Problem with GO in T-SQL