sql-server - 使用 sp_executesql proc 创建 SQL 登录

标签 sql-server dynamic-sql

以下代码不起作用:

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/

相关文章:

sql - 如果第一个匹配没有行,则如何条件连接,使用第二个匹配

sql - 如何限制 NULL 作为 SQL Server 存储过程的参数?

sql - 将值存储在临时表中

PostgreSQL 函数在循环函数中动态 reshape 和创建表

sql - 在 PL/PGSQL 动态 SQL 内部函数中引用局部变量

c# - 无法立即连接到新创建的 SQL Server 数据库

sql - 如何以编程方式为过去和 future 增加两周的开始日期和结束日期?

sql - SQL Server 中的 Geohash 函数?

postgresql - 在 COMMENT ON TABLE 中放置时间戳

linq-to-entities - 如何创建一个非常动态的 LinqToEntity 查询?