Неверный синтаксис рядом с \ и GO с циклом создания пользователя - PullRequest
0 голосов
/ 14 февраля 2019

Я сталкиваюсь с проблемой синтаксиса моего антиспеша и динамического 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 голосов
/ 14 февраля 2019

Проблема не в обратном слэше.Кажется, проблема в том, что GO недопустимо в динамическом sql.Может быть, вы можете изменить свой скрипт для выполнения каждого оператора в собственной транзакции?

Проблема с GO в T-SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...