【发布时间】:2011-12-01 08:06:15
【问题描述】:
我有一个目标表 TBLA 和一个源表 TBLB。
第 1 步:我从我的数据库表中获取 SQL:
-- I ran this process in a cursor such that `@Sql` is a pass-in selected column value:
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'SELECT TBLB.coloumA, TBLB.coloumB... into ##TempTable
FROM TBLB
WHERE CONVERT(VARCHAR(10),Date,120)='2011-04-05'';
EXEC sp_ExecuteSql @sql
第 2 步:我通过调用另一个 sp_ExecuteSql 来删除目标表数据:
DECLARE @CheckClear NVARCHAR(MAX);
SET @CheckClear = 'DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)';
EXEC sp_ExecuteSql @CheckClear ;
-- This section is where the problem starts, described below.
第 3 步:通过 select * from temp table 插入 TBLA
DECLARE @DumpSql NVARCHAR(MAX);
SET @DumpSql = 'INSERT INTO TBLA
SELECT * FROM ##TempTable';
EXEC sp_ExecuteSql @DumpSql ;
如第 2 步末尾所述,问题如下:
执行删除语句后,我发现我的所有数据都丢失了,它似乎只执行了第一个命令(DELETE FROM TBLA)。
在我尝试删除语句之前,我注释掉了 ##TempTable 值,它起作用了,我只有 2011-11-04 的数据。 (TBLA 已经有 2011-11-03 和 2011-11-02 的数据)。
我实际上是按日期值选择数据。到目前为止,它似乎是成功的。
然后,我打开我的TBLA 并看到结果只包含2011-11-04 数据...其余的在哪里?
请注意:
上面的 SQL 只是我使用 sp_executesql 的动态存储产品的一部分...
我的实际数据包含大约 300 个需要处理的表。这些表中的每一个都有不同的唯一身份,所以我不能使用:SELECT * FROM ##Temptable WHERE id=bla
最好的方法是什么?
【问题讨论】:
标签: sql sql-server tsql temp-tables