Как вы, возможно, узнали, вы должны использовать литералы для подобных задач. В результате вы должны использовать динамический SQL и безопасно ввести значения Например, для входа в систему (при условии, что значения параметров были установлены в SP):
DECLARE @SQL nvarchar(MAX);
IF NOT EXISTS (SELECT 1
FROM sys.syslogins
WHERE name = @MyLogin)
SET @SQL = N'CREATE LOGIN ' + QUOTENAME(@MyLogin) + N' WITH PASSWORD = N' + QUOTENAME(@MyPassword,'''') + N';';
EXEC sp_executesql @SQL;
Еслилогин уже существует, тогда @SQL
будет иметь значение NULL
и не будет создан.
В результате ваш окончательный SP будет выглядеть примерно так:
CREATE PROC dbo.SetupLogin @MyLogin sysname, @MyDatabase sysname, @MyPassword nvarchar(128) AS
BEGIN
DECLARE @SQL nvarchar(MAX);
IF NOT EXISTS (SELECT 1
FROM sys.syslogins
WHERE name = @MyLogin)
SET @SQL = N'CREATE LOGIN ' + QUOTENAME(@MyLogin) + N' WITH PASSWORD = N' + QUOTENAME(@MyPassword,'''') + N';';
EXEC sp_executesql @SQL;
SET @SQL = N'CREATE DATABASE ' + QUOTENAME (@MyDatabase) + N';'
EXEC sp_executesql @SQL;
SET @SQL = N'USE ' + QUOTENAME (@MyDatabase) + N';' + NCHAR(13) + NCHAR(10) +
N'CREATE USER ' + QUOTENAME(@MyLogin) + N' FOR LOGIN ' + QUOTENAME(@MyLogin) + N';' + NCHAR(13) + NCHAR(10) +
N'ALTER ROLE db_owner ADD MEMBER ' + QUOTENAME(@MyLogin) + N';'; --sp_addrolemember is deprecated, stop using it.
EXEC sp_executesql @SQL;
END;