Каков правильный синтаксис "GO" в MSSQL?

Я пытаюсь запустить скрипт, который добавляет логин в MSSQL, он включает две команды GO, обе из которых выдают ошибку: Msg 102 ... Неверный синтаксис рядом с 'GO'. Следующий пример кода выполняется в базе данных с именем MyDB

DECLARE @currentUsername varchar(30);
DECLARE @password varchar(10);
SET @currentUsername = 'thisisatest';
SET @password = 'mypassword13';

DECLARE @addUser varchar(1000);
SET @addUser = '
    CREATE LOGIN ' + @currentUsername + '
    WITH PASSWORD = ''' + @password + ''',
    DEFAULT_DATABASE = [MyDB]
    GO
    USE MyDB
    CREATE USER ' + @currentUsername + ' FOR LOGIN ' + @currentUsername + '
    EXEC sp_addrolemember ''db_datareader'', ''' + @currentUsername + '''
    EXEC sp_addrolemember ''db_datawriter'', ''' + @currentUsername + '''
    GO
';
PRINT @addUser;
EXEC (@addUser);

1 ответ

Решение

GO не обычный оператор SQL. Из MSDN:

GO не является оператором Transact-SQL; это команда, распознаваемая утилитами sqlcmd и osql и редактором кода SQL Server Management Studio.

Попробуйте разбить его на несколько вызовов, как это:

DECLARE @currentUsername varchar(30);
DECLARE @password varchar(10);
SET @currentUsername = 'thisisatest';
SET @password = 'mypassword13';

DECLARE @addUser varchar(1000);
SET @addUser = '
    CREATE LOGIN ' + @currentUsername + '
    WITH PASSWORD = ''' + @password + ''',
    DEFAULT_DATABASE = [MyDB]
';
PRINT @addUser;
EXEC (@addUser);

SET @addUser = '
    USE MyDB
    CREATE USER ' + @currentUsername + ' FOR LOGIN ' + @currentUsername + '
    EXEC sp_addrolemember ''db_datareader'', ''' + @currentUsername + '''
    EXEC sp_addrolemember ''db_datawriter'', ''' + @currentUsername + '''
';
PRINT @addUser;
EXEC (@addUser);
Другие вопросы по тегам