执行存储过程时提示Invalid object name错误的求助
问题分析与解决方法
你遇到的错误根源是:QUOTENAME(@table_name)会把传入的带schema的表名pricing.pricingprod2023_nom3_copy2整体包裹为[pricing.pricingprod2023_nom3_copy2],SQL Server会将其识别为单一对象名(而非schema.表名的组合),因此找不到对应的表。
以下是两种可行的解决方式:
方式一:固定Schema,调用时仅传表名
如果存储过程仅用于查询pricing schema下的表,可直接在存储过程中指定schema:
ALTER PROCEDURE pricing.select_from_table @table_name NVARCHAR(255) AS BEGIN DECLARE @sql NVARCHAR(MAX); SET @sql = N'SELECT * FROM pricing.' + QUOTENAME(@table_name); EXEC sp_executesql @sql; END
调用语句修改为:
EXECUTE [pricing].[select_from_table] 'pricingprod2023_nom3_copy2'
方式二:支持传入带Schema的表名
若需要存储过程兼容任意schema的表,可拆分schema和表名后分别转义:
ALTER PROCEDURE pricing.select_from_table @table_name NVARCHAR(255) AS BEGIN DECLARE @sql NVARCHAR(MAX); DECLARE @schema NVARCHAR(255) = 'dbo'; -- 设置默认schema DECLARE @tbl NVARCHAR(255); -- 判断输入是否包含schema分隔符 IF CHARINDEX('.', @table_name) > 0 BEGIN SET @schema = LEFT(@table_name, CHARINDEX('.', @table_name) - 1); SET @tbl = RIGHT(@table_name, LEN(@table_name) - CHARINDEX('.', @table_name)); END ELSE BEGIN SET @tbl = @table_name; END -- 分别转义schema和表名,拼接执行语句 SET @sql = N'SELECT * FROM ' + QUOTENAME(@schema) + '.' + QUOTENAME(@tbl); EXEC sp_executesql @sql; END
此时原调用语句可直接正常执行:
EXECUTE [pricing].[select_from_table] 'pricing.pricingprod2023_nom3_copy2'
内容的提问来源于stack exchange,提问作者akshenndra garg
相关产品推荐
相关产品推荐

