以下代码不起作用:
declare @pUserName nvarchar(50) = N'[test2]' ;
declare @pPassword nvarchar(50) = N'''123456''';
declare @QueryString as nvarchar(max);
declare @ParmDefinition as nvarchar(max);
SET @QueryString = N'CREATE LOGIN @dUserName WITH PASSWORD= @dpassword , DEFAULT_DATABASE=[Yerknain] ,DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=ON, CHECK_POLICY=ON';
SET @ParmDefinition = N'@dUserName nvarchar(50) , @dpassword nvarchar(50)';
EXECUTE sp_executesql @QueryString, @ParmDefinition,
@dUserName = @pUserName,
@dpassword = @pPassword;
它抛出一个错误:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '@dUserName'.
但是当我将其更改为以下内容时:
declare @pUserName nvarchar(50) = N'test2' ;
declare @pPassword nvarchar(50) = N'123456';
declare @QueryString as nvarchar(max);
declare @ParmDefinition as nvarchar(max);
SET @QueryString = N'CREATE LOGIN [@dUserName] WITH PASSWORD= ''@dpassword'' , DEFAULT_DATABASE=[Yerknain] ,DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=ON, CHECK_POLICY=ON';
SET @ParmDefinition = N'@dUserName nvarchar(50) , @dpassword nvarchar(50)';
EXECUTE sp_executesql @QueryString, @ParmDefinition,
@dUserName = @pUserName,
@dpassword = @pPassword;
它正在工作,但不是用名称“test2”注册新用户,而是用名称“@pUserName”注册。
有什么方法可以通过 sp_executesql
过程解决这个问题(不仅仅是通过 exec ,我需要检查所有内容)?
最佳答案
尝试使用像这样的字符串连接来构建@QueryString
。请注意,这样做时,您不需要将这些作为参数发送到 sp_executesql
。
SET @QueryString = N'CREATE LOGIN '+QUOTENAME(@dUserName)+' WITH PASSWORD= '''+REPLACE(@dpassword,'''','''''')+''' , DEFAULT_DATABASE=[Yerknain] ,DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=ON, CHECK_POLICY=ON';
关于sql-server - 使用 sp_executesql proc 创建 SQL 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40564569/