Это должно дать вам результат, которого вы добились, при условии имя пользователя фактически жестко закодировано в [User]
.Если это не так, вам нужно дополнительно параметризировать свой запрос и процитировать соответствующие имена объектов:
DECLARE @nameDB sysname = N'YourDB';
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'USE ' + QUOTENAME(@nameDB) + N';' + NCHAR(13) + NCHAR(10) +
N'IF (DATABASE_PRINCIPAL_ID(N''User'') IS NULL) BEGIN' + NCHAR(13) + NCHAR(10) +
N' CREATE USER [User] FOR LOGIN [User];' + NCHAR(13) + NCHAR(10) +
N' ALTER ROLE db_datareader ADD MEMBER [User];' + NCHAR(13) + NCHAR(10) +
N'END;';
PRINT @SQL; --Your best friend.
EXEC sp_executesql @SQL;
Редактировать: USER_ID
устарело, я должен знать лучше.
Пример параметризованной версии для пользователя:
DECLARE @nameDB sysname = N'YourDB';
DECLARE @User sysname = N'User'
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'USE ' + QUOTENAME(@nameDB) + N';' + NCHAR(13) + NCHAR(10) +
N'IF (DATABASE_PRINCIPAL_ID(@User) IS NULL BEGIN' + NCHAR(13) + NCHAR(10) +
N' CREATE USER ' + QUOTENAME(@User) + N' FOR LOGIN ' + QUOTENAME(@User) + N';' + NCHAR(13) + NCHAR(10) +
N' ALTER ROLE db_datareader ADD MEMBER ' + QUOTENAME(@User) + N';' + NCHAR(13) + NCHAR(10) +
N'END;';
EXEC sp_executesql @SQL, N'@User sysname', @User = @User;