天道酬勤,学无止境

There is already an object named '#tmptable' in the database

问题

我正在尝试执行存储过程,但我遇到了现有临时表的问题,但我只是创建一个时间并用于另一部分代码

SELECT ...
INTO #tmpUnidadesPresupuestadas 
FROM proce.table1 

--Insertar in table src..
INSERT INTO table (
 ....) 
SELECT
....
FROM
    #tmpUnidadesPresupuestadas

我收到这条消息:

数据库中已经有一个名为“#tmpUnidadesPresupuestadas”的对象。

我该如何解决? 问候

回答1

如果不查看更多代码,则无法知道以下情况是否是您的问题,但可能是。

当您有互斥的代码分支,它们都对同一个临时表执行 SELECT...INTO 时,缺陷会导致此错误。 SELECT...INTO to a temp table 创建具有用于填充它的查询结构的表。 解析器假设如果这种情况发生两次,这是一个错误,因为一旦表已经有数据,您就无法重新创建表的结构。

if @Debug=1
    select * into #MyTemp from MyTable;
else
    select * into #MyTemp from MyTable;

虽然显然意义不大,但仅此一项就说明了问题。 这两条路径是互斥的,但解析器认为它们可能都被执行,并发出致命错误。 您扩展它,将每个分支包装在 BEGIN...END 中,并添加删除表(有条件或无条件),解析器仍然会给出错误。

公平地说,实际上两条路径都可以执行,如果有一个循环或 GOTO 以便一次在 @Debug = 1 附近,而另一次则没有,所以它可能对解析器的要求太多。 不幸的是,我不知道解决方法,并且使用 INSERT INTO 而不是 SELECT INTO 是我知道避免该问题的唯一方法,即使在特别多的列查询中命名所有列可能非常繁琐。

回答2

临时表在当前会话的整个过程中都存在。 如果您多次运行此语句,则该表已经存在。 要么检测到并截断它,要么在选择它之前将其drop (如果存在):

DROP TABLE IF EXISTS #tmpUnidadesPresupuestadas

如果在 SQL Server 2016 之前,您可以这样删除:

IF OBJECT_ID('tempdb.dbo.#tmpUnidadesPresupuestadas', 'U') IS NOT NULL
  DROP TABLE #tmpUnidadesPresupuestadas; 
回答3
回答4
回答5

我有点不清楚你在尝试什么。 我假设您此时不想删除表格。 我相信您可能正在寻找的语法是 Insert Into

Insert into #tmpUnidadesPresupuestadas (Col1, col2, ... colN)
Select firstcol, secondcol... nthCol 
From Data

如果您确实希望删除该表,则先前的答案已涵盖。

回答6

这可能对其他人有用,请记住,如果在单个存储过程或批处理中创建了多个临时表,则它们必须具有不同的名称。 如果您使用相同的名称,您将无法更改程序。

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2012/ms174979(v=sql.110)#temporary-tables

回答7
 IF OBJECT_ID('tempdb..#TmpTBL') IS NOT NULL
        DROP TABLE #TmpTBL;

SELECT TOP(0) Name , Address,PhoneNumber 
INTO #TmpTBL
FROM EmpDetail 

if @Condition=1
    INSERT INTO #TmpTBL (Name , Address,PhoneNumber) 
    SELECT Name , Address,PhoneNumber FROM EmpDetail;
else
    INSERT INTO #TmpTBL (Name , Address,PhoneNumber) 
    SELECT Name , Address,PhoneNumber FROM EmpDetail;

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • There is already an object named '#tmptable' in the database
    I´m trying to execute stored procedure but I get an issue of an existing temporal table, but I just create one time and use into another part of code SELECT ... INTO #tmpUnidadesPresupuestadas FROM proce.table1 --Insertar in table src.. INSERT INTO table ( ....) SELECT .... FROM #tmpUnidadesPresupuestadas I get this message: There is already an object named '#tmpUnidadesPresupuestadas' in the database. How can I solve it? Regards
  • 您能否创建一个 CLR UDT 以允许跨数据库共享表类型?(Can you create a CLR UDT to allow for a shared Table type across databases?)
    问题 如果我有这样的 SQL 语句: CREATE TYPE [dbo].[typeRateLimitVariables] AS TABLE( [vchColumnName] [varchar](250) NULL, [decColumnValue] [decimal](25, 10) NULL ) 我将它用作数据库中 UDF 的表变量,我有足够的范围。 但是假设我想从同一台服务器上的另一个数据库调用标量 UDF,然后我会得到一个未知的类型错误。 我试过在调用数据库上创建类型,但 obv. 然后我得到一个类型不匹配,因为虽然每个 UDT 具有相同的名称,但它们具有不同的范围,因此是不同的类型。 我知道您可以创建 CLR 类型,将程序集注册到 SQL Server,然后通用地访问自定义类型。 我的想法是创建一个“TABLE”类型的 CLR UDT,但是我看不出这是如何实现的,因为我知道它必须是 CLR 类型“SqlDbType.Structured”; 我的问题是: 有没有办法不使用 CLR 在 SQL 2008 R2 中为表变量创建全局范围,如果没有... 如何在 C# CLR 中定义 UDT,其中 UDT 本质上是一个 UDT“AS TABLE” 回答1 我知道您可以创建 CLR 类型,将程序集注册到 SQL Server,然后通用地访问自定义类型。 你确定吗?
  • MySQL临时表
    MySQL 临时表MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那每当PHP脚本执行完成后,该临时表也会自动销毁。如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。实例以下展示了使用MySQL 临时表的简单实例,以下的SQL代码可以适用于PHP脚本的mysql_query()函数。>mysql> CREATE TEMPORARY TABLE SalesSummary ( -> product_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
  • MySQL临时表
    MySQL临时表 MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。 临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。 MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那每当PHP脚本执行完成后,该临时表也会自动销毁。 如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。 实例 以下展示了使用MySQL 临时表的简单实例,以下的SQL代码可以适用于PHP脚本的mysql_query()函数。 >mysql> CREATE TEMPORARY TABLE SalesSummary ( -> product_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT
  • 用C#批量更新(Bulk Update in C#)
    问题 为了在数据库中插入大量数据,我曾经将所有插入信息收集到一个列表中,然后将此列表转换为DataTable 。 然后,我通过SqlBulkCopy将列表插入数据库。 我将生成的列表发送到哪里LiMyList 其中包含我要插入数据库的所有批量数据的信息并将其传递给我的批量插入操作 InsertData(LiMyList, "MyTable"); 其中InsertData是 public static void InsertData<T>(List<T> list,string TableName) { DataTable dt = new DataTable("MyTable"); clsBulkOperation blk = new clsBulkOperation(); dt = ConvertToDataTable(list); ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); using (SqlBulkCopy bulkcopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString)
  • 选择 sysobjects 中具有名为“mytable”的表的所有数据库,而不管模式如何?(select all databases in sysobjects that have a table named 'mytable' regardless of schema?)
    问题 对于给定的 sql 2000 - 2008 服务器,我想在该服务器上找到任何名为 dbo.[MyTable] 的表。 此外,如何查找所有具有名为 [dbo].[MyTable] 和 [AnySchemaName].[MyTable] 的表的数据库。 是否有像 spTables MyTable 这样的简单 sp_ 命令? 还是“sp_AllDatabaseTable [MyTable]”? 我想把它打印出来: ServerName Database SchemaName MyTable Date Created ----------- --------- ----------- --------- ------------- 谢谢 回答1 当然,您可以将sp_msforeachdb用于此目的,但您需要记住 fhis 函数既没有记录也没有官方支持。 此外,有时它会破裂。 更多关于它在这里制作一个更可靠和灵活的 sp_MSforeachdb 您可以使用此脚本在所有数据库中按名称搜索表。 我从 SQL 服务器的每个数据库中的 Find 表中取出它 DECLARE @TableName VARCHAR(256) SET @TableName='YOUR_TABLE_NAME' DECLARE @DBName VARCHAR(256) DECLARE @varSQL VARCHAR
  • TSQL Cursor how to check if already declared and thus deallocate
    How can I make sure that I deallocate a cursor if it already exists before I try and open it again? For a table I can use something like: if exists (select top 1 from tempdb.sys.tables where name = '##tmpTable') drop table ##tmpTable; ... then I can recreate my ##tmpTable But I can't work out how to do it for a cursor like -- First clean up if already exists.. ..... <----- what goes here??? -- Declare and use a cursor DECLARE someCursorName CURSOR FOR select something from somewhere FOR READ ONLY I'm doing this to ensure that my script cleans up before it starts work Best I can come up with is
  • 我可以在删除临时表后重新创建它吗?(Can I recreate a temp table after dropping it?)
    问题
  • Can I recreate a temp table after dropping it?
    Given: code inside a stored proc: select bleh into #tblTemp from FunctionThatReturnsTable('some','params') -- do some stuff drop table #tblTemp -- Error on this command: -- 'There is already an object named '#tblTemp' in the database.' select bleh into #tblTemp from FunctionThatReturnsTable('some','other params') Problem: I can't recreate this temp table. My work around is to use #tmpTable1, #tmpTable2, #tempTable3 etc. Is there a way I can get around this? It would be nice just use one temp table each time. If not, what is the reason for this?
  • 如何在插入后进行插入并将数据与第一次插入的结果 ID 相结合(How to make insert after insert and combine data with result ID's from first insert)
    问题 DECLARE @tmpTable TABLE (UserId INT, Name nvarchar(50), Department nvarchar(50)) DECLARE @xml XML= N'<user><userId>1</userId><name>John</name><department>A</department></user> <user><userId>2</userId><name>Jane</name><department>B</department></user>'; insert into @tmpTable SELECT a.b.value('(./userId)[1]', 'int') AS UserId, a.b.value('(./name)[1]', 'nvarchar(50)') AS Name, a.b.value('(./department)[1]', 'nvarchar(50)') AS Department FROM @xml.nodes('/user') a(b) INSERT INTO members (name) OUTPUT Inserted.MemberId SELECT Name FROM @tmpTable 现在这将输出新成员的 id。 我需要对另一个表进行另一个插入,这需要: MemberId
  • 在MySQL中,我可以复制一行以插入到同一张表中吗?(In MySQL, can I copy one row to insert into the same table?)
    问题 insert into table select * from table where primarykey=1 我只想复制一行以插入到同一表中(即,我想复制表中的现有行),但是我想这样做而不必在“选择”之后列出所有列,因为该表具有列过多。 但是当我这样做时,我得到了错误: 密钥1的条目“ xxx”重复 我可以通过创建另一个表来创建一个表,该表具有与要复制的记录的临时容器相同的列: create table oldtable_temp like oldtable; insert into oldtable_temp select * from oldtable where key=1; update oldtable_tem set key=2; insert into oldtable select * from oldtable where key=2; 有没有更简单的方法来解决这个问题? 回答1 我使用Leonard Challis的技术进行了一些更改: CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1; UPDATE tmptable_1 SET primarykey = NULL; INSERT INTO table SELECT * FROM tmptable_1
  • MySQL Count 来自所有子类别的产品(MySQL Count products from all subcategories)
    问题 我有两张桌子; 类别和产品。 对于每个类别,我想计算其所有子类别中有多少产品。 我已经计算了每个类别中有多少。 示例表是: 类别: ID ParentID ProductCount SubCategoryProducts 1 NULL 0 2 1 2 3 2 1 产品: ProductID CategoryID 123 2 124 2 125 3 所以我希望我的功能是: ID ParentID ProductCount SubCategoryProducts 1 NULL 0 3 2 1 2 1 3 2 1 0 它只需要作为一个选择查询,不需要更新数据库。 有任何想法吗? 编辑:SQL 小提琴:http://sqlfiddle.com/#!2/1941a/4/0 回答1 如果是我,我会创建一个存储程序。 另一种选择是在第一个查询中使用 PHP 循环,然后为每个 ID 运行另一个查询 - 但这种逻辑会大大减慢您的页面速度。 这是关于存储过程的一个很好的教程:http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ 基本上你可以运行我上面提到的与 PHP 相同的循环(但它运行得更快)。 该过程存储在数据库中,可以像函数一样调用。 结果与查询相同。 根据要求,这里有一个示例程序(或者更确切地说
  • 如何获取存储过程中的表列表?(How can I get the list of tables in the stored procedure?)
    问题 数据库中有很多表和sp。 我找到了在特定sp(存储过程)中使用的表名。 sp_depends %sp_name%不给出期望的结果。 我还使用了INFORMATION_SCHEMA.TABLES , INFORMATION_SCHEMA.ROUTINES表。 但是结果不能完全满足我的要求。 回答1 投票率最高的两个答案使用了许多不建议使用的表,应避免使用这些表。 这是一种更清洁的方法。 获取存储过程所依赖的所有表: SELECT DISTINCT p.name AS proc_name, t.name AS table_name FROM sys.sql_dependencies d INNER JOIN sys.procedures p ON p.object_id = d.object_id INNER JOIN sys.tables t ON t.object_id = d.referenced_major_id ORDER BY proc_name, table_name 与MS SQL SERVER 2005+一起使用 变更清单: sysdepends应该替换为sys.sql_dependencies 新表使用object_id代替id 新表使用referenced_major_id而不是depid 应该将sysobjects替换为更集中的系统目录视图正如marc
  • Linq .Contains with large set 导致 TDS 错误(Linq .Contains with large set causes TDS error)
    问题 我把它简化了一点,因为我正在寻找一个通用的答案。 假设我有一个这样的表设置: Parent recno int (unique, pk) date datetime stuff varchar(50) Child parentrecno (int, fk) --- PK sequence (int) --- PK data varchar(50) 在我的 C# 程序中,为了找到我感兴趣的父记录并将它们填充到列表中,我经历了很多麻烦。 Parent 是一个非常大的表,除了必要之外,我宁愿不查询它。 所以我松鼠了钥匙: List<int> recs = (from d in Parent where [.....] select d.recno).ToList(); 稍后在 Linq 中,我可以说,找到关联父母的所有子记录: var kids = from k in database.Childs where recs.Contains(k.parentrecno) select new { k }; 这一切都很好,直到 recs 包含超过 2100 个条目。 然后我收到 TDS RPC 错误(参数太多)。 我看到它的方式我可以: 直接用 SQL 完成整个事情(真的不想用 DataReader 等麻烦事……)。 有一个外部系统参与了对记录的限定,所以我也不知道这是否完全可能。
  • 检索存储过程结果集的列定义(Retrieve column definition for stored procedure result set)
    问题 我正在使用SQL Server 2008中的存储过程,并且已经了解到必须INSERT INTO预先定义的临时表才能使用数据。 很好,除非我不是写存储过程的人(除了列出存储过程的定义并阅读代码),否则我如何弄清楚如何定义临时表? 例如,EXEC sp_stored_procedure的临时表是什么样的? 那是一个简单的存储过程,我可能会猜到数据类型,但是似乎必须有一种方法可以读取从执行该过程返回的列的类型和长度。 回答1 因此,假设您在tempdb中有一个存储过程: USE tempdb; GO CREATE PROCEDURE dbo.my_procedure AS BEGIN SET NOCOUNT ON; SELECT foo = 1, bar = 'tooth'; END GO 您可以使用一种非常复杂的方法来确定存储过程将输出的元数据。 有几个警告,包括该过程只能输出单个结果集,并且如果不能精确确定该数据类型,则将对它进行最佳猜测。 它要求使用OPENQUERY和回送链接服务器,且'DATA ACCESS'属性设置为true。 您可以检查sys.servers以查看是否已经有一个有效的服务器,但是我们只创建一个手动称为loopback : EXEC master..sp_addlinkedserver @server = 'loopback', @srvproduct
  • 从这样的表中检索层次结构(Retrieve hierarchy from a table like this)
    问题
  • Spark - Creating Nested DataFrame
    I'm starting with PySpark and I'm having troubles with creating DataFrames with nested objects. This is my example. I have users. $ cat user.json {"id":1,"name":"UserA"} {"id":2,"name":"UserB"} Users have orders. $ cat order.json {"id":1,"price":202.30,"userid":1} {"id":2,"price":343.99,"userid":1} {"id":3,"price":399.99,"userid":2} And I like to join it to get such a struct where orders are array nested in users. $ cat join.json {"id":1, "name":"UserA", "orders":[{"id":1,"price":202.30,"userid":1},{"id":2,"price":343.99,"userid":1}]} {"id":2,"name":"UserB","orders":[{"id":3,"price":399.99
  • Spark - 创建嵌套数据帧(Spark - Creating Nested DataFrame)
    问题 我从 PySpark 开始,但在创建带有嵌套对象的 DataFrame 时遇到了麻烦。 这是我的例子。 我有用户。 $ cat user.json {"id":1,"name":"UserA"} {"id":2,"name":"UserB"} 用户有订单。 $ cat order.json {"id":1,"price":202.30,"userid":1} {"id":2,"price":343.99,"userid":1} {"id":3,"price":399.99,"userid":2} 我喜欢加入它以获得这样一个结构,其中订单是嵌套在用户中的数组。 $ cat join.json {"id":1, "name":"UserA", "orders":[{"id":1,"price":202.30,"userid":1},{"id":2,"price":343.99,"userid":1}]} {"id":2,"name":"UserB","orders":[{"id":3,"price":399.99,"userid":2}]} 我怎样才能做到这一点 ? 是否有任何类型的嵌套连接或类似的东西? >>> user = sqlContext.read.json("user.json") >>> user.printSchema(); root |-- id: long
  • SQL 链接服务器查询非常非常慢(SQL Linked server query very very slow)
    问题 我正在通过链接服务器从 VIEWS 中提取大量数据。 我使用的是 SQL Server 2012,链接服务器是 SQL Server 2008 我的选择语句是 SELECT * INTO MY_LOCAL_TABLE FROM ( SELECT * FROM LINKEDSERVER.DB.TABLE.VIEW WHERE DATE>'2012-01-01' AND ID IN (SELECT ID FROM MY_LOCAL_VIEW) ) Q 我预计将近 700 个 ID 有 300K 行。 以前需要几个小时,但现在需要 20 多个小时!! 您能否为此 PAIN 提出任何替代解决方案? 非常感谢提前! 回答1 当您使用由 4 部分组成的名称时,例如[server].db.dbo.table ,尤其是在join ,通常会通过网络将整个表复制到本地计算机,这显然不理想。 更好的方法是使用OPENQUERY —— 它在源(链接服务器)处处理。 尝试: SELECT * FROM OPENQUERY([LINKEDSERVER], 'SELECT * FROM DB.TABLE.VIEW WHERE DATE>'2012-01-01') AND ID IN (SELECT ID FROM MY_LOCAL_VIEW) 使用这种方法,链接服务器将返回日期 > x 的所有行
  • 在 SQL Server 2000 中将一组行转置为列(Transpose a set of rows as columns in SQL Server 2000)
    问题 在 SQL Server 中是否有将行转换为列的工具(在 MS-Access 中是可能的)? 我很困惑,因为这个工具在 MS-Access 中可用,但在 SQL Server 中不可用。 SQL Server 中未包含此功能是否是有意设计的? 回答1 http://jdixon.dotnetdevelopersjournal.com/pivot_table_data_in_sql_server_2000_and_2005.htm 上的示例仅在您事先知道行值可以是什么时才有效。 例如,假设您有一个具有自定义属性的实体,并且自定义属性作为子表中的行实现,其中子表基本上是变量/值对,而这些变量/值对是可配置的。 color red size big city Chicago 我将描述一种有效的技术。 我用过。 我不是在宣传它,但它确实有效。 要在您事先不知道值是什么的地方旋转数据,请动态创建一个没有列的临时表。 然后使用游标循环遍历行,为每个变量发出一个动态构建的“更改表”,以便最终您的临时表具有列、颜色、大小、城市。 然后在临时表中插入一行,通过另一个光标通过变量、值对更新它,然后选择它,通常与其父实体连接,实际上使这些自定义变量/值对看起来像内置的 -在原始父实体的列中。 回答2 所描述的游标方法可能是使用起来最不像 SQL 的方法。 如前所述,SQL 2005 及更高版本的