2015-04-06 148 views
0

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

好,你要使用动态SQL而不实际使其动态 – Lamak

+0

你必须创建动态SQL和运行EXEC或sp_executesql的 –

+0

谢谢你之前增加了一个需要空间。我将研究创建动态SQL过程。我通过查看一个类似于varchar变量的过程来创建这个过程。 –

回答

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)', @[email protected]; 

详见this page

编辑:WITH