【发布时间】:2019-12-20 06:34:38
【问题描述】:
我正在尝试创建一个 sql 脚本来创建一个数据库、一个带有密码的登录名,然后将该登录名添加到数据库中。
这是我目前所拥有的。尝试执行创建登录语句时失败并出现错误
消息 102,第 15 级,状态 1,第 1 行
“login1”附近的语法不正确。
我假设它失败了,因为我需要在密码周围加上单引号,但我不知道该怎么做。我该如何解决这个问题?
DECLARE @db varchar(50) = 'Database1';
DECLARE @userName varchar(50) = 'login1';
DECLARE @pwd varchar(50) = @userName;
DECLARE @createDb varchar(MAX);
DECLARE @createUser varchar(MAX);
DECLARE @useDb varchar(MAX);
DECLARE @addUserToTable varchar(MAX);
DECLARE @grantUserTablePrivileges varchar(MAX);
SET @createDb = 'CREATE DATABASE {DBNAME}';
SET @useDb = 'USE {DBNAME}';
SET @createUser = 'CREATE LOGIN {USERNAME} WITH PASSWORD = "{PWD}"';
SET @addUserToTable = 'CREATE USER {USERNAME} FOR LOGIN {USERNAME}';
SET @grantUserTablePrivileges = 'sp_addrolemember db_owner, {USERNAME}';
DECLARE @script varchar(MAX);
SET @script = REPLACE(@createDb, '{DBNAME}', @db);
PRINT(@script);
EXECUTE (@script);
SET @script = REPLACE(@createUser, '{USERNAME}', @userName);
SET @script = REPLACE(@script, '{PWD}', @pwd);
PRINT(@script);
EXECUTE (@script);
SET @script = REPLACE(@useDb, '{DBNAME}', @db);
PRINT(@script);
EXECUTE (@script);
SET @script = REPLACE(@addUserToTable, '{USERNAME}', @userName);
PRINT(@script);
EXECUTE (@script);
SET @script = REPLACE(@grantUserTablePrivileges, '{USERNAME}', @userName);
PRINT(@script);
EXECUTE (@script);
【问题讨论】:
-
当您的代码中有错误时,您应该在问题中提供错误消息,这样其他人就不会试图成为人类的 sql 服务器。
-
添加,为了您的方便
-
你想知道,你可以通过加倍来转义单引号 (
'')? -
对动态 sql 始终需要做的一件事是在尝试执行代码之前查看代码。然后,您实际上还应该尝试手动执行代码。当你这样做时,你会看到你在 CREATE LOGIN 中有无效的语法。您不能在字符串文字周围使用双引号。
-
提示:将对象名称组装成动态 SQL 语句时的最佳做法是使用
QuoteName()以避免出现奇怪名称的问题,例如New Table带有空格或保留字,例如From。
标签: sql-server tsql