TSQL:在动态SQL中使用“输出”子句

时间:2018-12-17 06:18:34

标签: sql sql-server tsql

我在Output语句中使用了Insert子句,该子句要求使用Table Variable。我还希望Table name是动态的,因此我正在使用dynamic SQL,但不允许使用Table Variable。我收到错误Must declare the scalar variable "@InsertedId"

CREATE PROCEDURE sp_InsertPerson @Name varchar(50), @Table varchar(20) AS
  DECLARE @InsertedId TABLE (Id int)
  DECLARE @SQL nvarchar(200) = 'INSERT INTO ' + @Table + ' (Name) OUTPUT INSERTED.Id INTO ' + @InsertedId + ' VALUES (' + @Name + ')'
  IF (@Name is not null AND @Name != '')
    EXEC(@SQL)
  SELECT Id FROM @InsertedId

如何同时使用Output子句和动态Table name

2 个答案:

答案 0 :(得分:3)

首先,请勿在存储过程中使用 sp_ 前缀,否则会导致MS将其保留给系统存储过程,并可能导致性能问题和其他问题(因为它可以养成习惯)。将 SysName 数据类型用作表名,并在连接字符串时使用 QUOTENAME() 函数。

您需要在DynamicSQL中将表声明为

CREATE PROCEDURE InsertPerson 
@Name varchar(50), 
@Table SysName
AS
  DECLARE @SQL NVARCHAR(MAX);

  SET @SQL = N'DECLARE @IDs TABLE (ID INT);'+
             'INSERT INTO ' + 
             QUOTENAME(@Table) + 
             ' (Name) OUTPUT INSERTED.ID INTO @IDs VALUES(@Name);'+
             'SELECT * FROM @IDs';
  EXECUTE sp_executesql @SQL,
                        N'@Name VARCHAR(50)',
                        @Name;

Demo

答案 1 :(得分:0)

尝试一下;

  CREATE PROCEDURE sp_InsertPerson @Name varchar(50), @Table varchar(20) AS

  DECLARE @SQL nvarchar(200) = ''  
  SET @SQL = @SQL + 'DECLARE @InsertedId TABLE (Id int)';      
  SET @SQL = @SQL + 'INSERT INTO ' + @Table + ' (Name) OUTPUT INSERTED.Id INTO @InsertedId (Id) VALUES (''' + @Name + ''')'    
  SET @SQL = @SQL + 'SELECT Id FROM @InsertedId'
  IF (@Name is not null AND @Name != '')
    EXEC(@SQL)