我在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
答案 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;
答案 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)