我正在尝试创建一个存储过程,并将表的名称作为参数传递,我收到此消息:必须声明表变量“@tblName”。
我必须改变什么才能让它工作?
CREATE PROCEDURE [usp_SaveToErrorLog]
@tblName as nvarchar(50),
@subject as nvarchar(30)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tblName))
Begin
Insert Into @tblName
(ErrorNumber, ErrorMessage, ErrorProcedure, ErrorState, ErrorSeverity, ErrorLine)
Select
ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_PROCEDURE(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_LINE()
End
END
不幸的是,您不能在 INSERT 语句中使用包含表名的变量。错误消息实际上正在发生,因为它期望一个表类型的变量来插入行,但是您传递的是一个带有字符串值的变量。
您可以使用动态 SQL使用变量表名称值执行命令,如下所示:
这样做是动态创建您的 T-SQL 命令并将其存储在 @Sql 变量中。然后使用存储过程sp_executesql执行 @Sql 变量中的 T-SQL 命令,该变量具有来自 @tblName 变量的实际表名。