在存储过程中正确使用输入参数
Proper usage of input parameters in a stored procedure
问题:
我正在尝试创建一个存储过程,该过程使用作为参数传入的用户名创建登录名。我调用过程时传入的参数没有用
我尝试过的:
我试过用 exec dbo.proc_add_user 'TestLogin'
.
调用我的程序
我认为以这种方式调用它会使用 "TestLogin" 代替 @arg1
.
这是我正在尝试的存储过程create/alter:
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' ...
...
我用这个方法得到了相同的结果。我会尽快回答任何问题,谢谢。
知道括号是一种引用形式很重要。仅当列名包含 space 或标点符号或与保留字冲突时才需要。
并且您的查询是动态的 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
之前添加了一个需要的 space
问题: 我正在尝试创建一个存储过程,该过程使用作为参数传入的用户名创建登录名。我调用过程时传入的参数没有用
我尝试过的:
我试过用 exec dbo.proc_add_user 'TestLogin'
.
调用我的程序
我认为以这种方式调用它会使用 "TestLogin" 代替 @arg1
.
这是我正在尝试的存储过程create/alter:
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
:
declare @userName varchar(255) = @arg1
BEGIN
CREATE LOGIN [@userName] WITH PASSWORD=N'password' ...
...
我用这个方法得到了相同的结果。我会尽快回答任何问题,谢谢。
知道括号是一种引用形式很重要。仅当列名包含 space 或标点符号或与保留字冲突时才需要。
并且您的查询是动态的 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
之前添加了一个需要的 space