问题: 我正在尝试创建一个存储过程,使用作为参数传入的用户名创建一个Login。我没有使用我调用程序时传入的参数。
我尝试了什么:
我试过用exec dbo.proc_add_user 'TestLogin'
调用我的程序
我认为以这种方式调用它会使用“TestLogin”代替@arg1
。
以下是我尝试创建/更改的存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[proc_add_user]
(
@arg1 varchar(255) = null
) AS
BEGIN
CREATE LOGIN [@arg1] WITH PASSWORD=N'password' MUST_CHANGE, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
GRANT ALTER ANY LOGIN TO [@arg1]
GRANT CONNECT SQL TO [@arg1]
GRANT VIEW ANY DEFINITION TO [@arg1]
GRANT VIEW SERVER STATE TO [@arg1]
END
它不是创建一个名为“TestLogin”的登录名,而是创建一个名为“@ arg1”的登录名。我还尝试将@arg1
设置为名为@userName
的声明的varchar:
declare @userName varchar(255) = @arg1
BEGIN
CREATE LOGIN [@userName] WITH PASSWORD=N'password' ...
...
我用这种方法得到了相同的结果。我会尽快回答任何问题,谢谢。
答案 0 :(得分:1)
知道括号是一种引用形式很重要。仅当列名包含空格或标点符号或与保留字冲突时才需要它。
你的查询是一个动态的sql,所以...你可以尝试:
DECLARE @SQLString VARCHAR(500);
SET @SQLString = 'CREATE LOGIN ' + @login_user + ' WITH PASSWORD=N''password'' MUST_CHANGE, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON';
EXEC sp_executesql @SQLString, N'@login_user varchar(255)', @login_user=@arg1;
有关详细信息,请参阅this page。
编辑:在WITH
之前添加了所需的空间