SQL Server 导入和导出向导在使用临时表的存储过程中给出无效对象错误
Posted
技术标签:
【中文标题】SQL Server 导入和导出向导在使用临时表的存储过程中给出无效对象错误【英文标题】:SQL Server Import and Export wizard gives invalid object error on stored procedure with temp table 【发布时间】:2013-02-13 17:36:43 【问题描述】:我创建了一个存储过程,它创建一个临时表、插入、选择然后删除。在 SQL Server Management Studio 中执行存储的过程可以正常工作并给出预期的结果。
CREATE PROCEDURE usp_TempTableTest
-- Add the parameters for the stored procedure here
@color VARCHAR(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
CREATE TABLE #tmptable (
color VARCHAR(10)
)
INSERT INTO #tmptable (color) VALUES (@color)
SELECT color FROM #tmptable
DROP TABLE #tmptable
END
GO
但是,在导入/导出工具中创建并使用该存储过程作为数据源时,它给了我错误:
无效的对象名称“#tmptable”。
知道为什么会发生这种情况吗?如果我将其更改为表变量,它似乎可以很好地用于导入/导出,但我不明白为什么它不能用于临时表。
【问题讨论】:
有没有办法可以在没有 DROP TABLE 命令的情况下尝试这个?当您写它与表变量一起使用时,它似乎找不到表,因为它已被删除。如果您删除 DROP TABLE 并且它可以工作,那么 DROP TABLE 命令就是问题所在。如果它仍然不起作用,则可能是其他原因导致错误。 我尝试从 sp 中完全删除 drop table,但在运行导入/导出工具时仍然返回临时表的无效对象错误。奇怪的是 sp 在 SQL studio 中执行时工作正常,但在导出作业中死掉了。这把我难住了。 【参考方案1】:当我在 SSMS 中运行一个模仿的存储过程时,就像你上面提到的那样,我可以像你在过程中提到的那样得到返回的数据。但是,如果我像您一样尝试#tmptable
,我也会收到相同的错误,因为DROP TABLE
将其删除。据我所知,导入/导出基本上是一个最终的INSERT
过程。它与表变量一起工作的原因是因为数据仍然存在于最终插入中;在DROP TABLE
的情况下,它没有。例如,当我删除 DROP TABLE
时,它可以工作。
我这里可能错了,但是在上述过程的情况下,导入或导出时的逻辑似乎是
INSERT
数据
SELECT
数据
DROP
数据
INSERT
(导入/导出):这会生成“无效的对象名称 tmptable”
使用变量(或没有DROP
),它是
INSERT
数据
SELECT
数据
INSERT
(导入/导出)
在第二种情况下,数据仍然存在。在第一种情况下,他们走了。如果您想使用#tmptable,一种解决方法,请以以下方式开始您的代码:
IF OBJECT_ID('tempdb..#tmptable') IS NOT NULL DROP TABLE #tmptable
【讨论】:
【参考方案2】:将“设置 FMTONLY 关闭;”就在“SET NOCOUNT ON”的正上方
http://msdn.microsoft.com/en-us/library/ms173839.aspx
【讨论】:
以上是关于SQL Server 导入和导出向导在使用临时表的存储过程中给出无效对象错误的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 导入导出向导 - 日期时间错误 - 特定值
使用导入导出向导将数据从 Excel 导入 Sql Server 时,如何更改列的默认 varchar 255?
SQL Server Management Studio -- 工具/导入和导出设置菜单在哪里?