T-SQL:我需要一个存储过程来使动态字符串工作吗?

时间:2013-11-01 16:38:28

标签: sql-server tsql

我正在尝试让这段代码工作,......

SELECT *
FROM UserInGroup

DECLARE @SqlQuery nvarchar(500),
    @userIds nvarchar(50),
    @GroupId nvarchar(50);

SET @userIds = '1, 2';
SET @SqlQuery = 
            'INSERT INTO UserInGroup
            (GroupId, UserId)
            SELECT ' + @GroupId + ', UserId
            FROM [User]
            WHERE UserId IN ('+ @userIds +')';

EXECUTE @SqlQuery
GO

SELECT *
FROM UserInGroup

但我收到以下错误:

  

Ms Ms 2812,Level 16,State 62,Line 16
  找不到存储过程''。

我试图把它放在存储过程中,但我什么也没得到。

3 个答案:

答案 0 :(得分:4)

您需要更改执行方式

EXECUTE @SqlQuery to ->> Exec (@SqlQuery)

您可以在此处详细了解EXECUTE (Transact-SQL)

答案 1 :(得分:1)

您的方法受SQL注入。您需要使用参数化的sp_executesql或使用用户定义的表值函数并与其连接以获取数据

答案 2 :(得分:0)

如果您正在使用SQL Server 2008或更新版本,我建议您使用可以在用户表上加入的表值参数。那你就不需要任何动态SQL了。有关 here 的更多信息。

然后你的程序看起来像这样:

Create procedure myBrandNewProcedureUsingTableValuedParameters
    @userIds myCustomTableType readonly,
    @GroupId nvarchar(50)
AS
BEGIN
  INSERT INTO UserInGroup
  (GroupId, UserId)
  SELECT  @GroupId, [User].UserId
  FROM [User]
  INNER JOIN
  @userIds as u
  on [User].UserID = u.UserID
END