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

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