在存储过程中正确使用输入参数

时间:2015-04-06 18:01:49

标签: sql-server sql-server-2008 stored-procedures

问题: 我正在尝试创建一个存储过程,使用作为参数传入的用户名创建一个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' ...
...

我用这种方法得到了相同的结果。我会尽快回答任何问题,谢谢。

1 个答案:

答案 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

之前添加了所需的空间