SQL Server:通过从临时表中选择值来删除

时间:2011-12-01 08:06:16

标签: sql sql-server tsql temp-tables

首先忘掉这个问题,

我想我应该通过在我存储的prod中提供一些我的查询示例来更清楚地了解我的问题

假设我有一个目标表TBLA和一个源表TBLB

步骤1:我从我的数据库表中获取sql,例如

--I Ran this process in a cursor that @Sql is actually a pass in selected coloum 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 my problem describe 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 ...

例如Senario

在我尝试删除语句之前,我只想选择##TempTable值,这是正确的。哦是的,它只有2011-11-04数据

实际上我的TBLA目前已有2011-11-03和2011-11-02数据。

PS:我实际上是按日期值选择数据。

这是我运行上面的sql,它的成功......

并且继续,我打开我的TBLA并查看结果。我的天啊!!!!它只有2011-11-04数据......其余的是哪里?

请注意:

以上sql只是我使用sp_executesql的dyamic存储prod的一部分.. 我的实际数据是我有300个表需要处理,正确的总共300个表有不同的唯一indentity所以我不能使Select * From ##Temptable Where id=something

希望这个问题更加清晰

谢谢你,感谢你的帮助

关于:

LiangCk

2 个答案:

答案 0 :(得分:2)

检查一下: 使用where条件中的子查询从mytable中删除行:

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2)

如果您要根据日期查找要删除的唯一值,请在Temporary表中创建唯一值,然后执行删除操作。

其次,如果你在某种程度上根据连接操作寻找删除操作: 然后点击此链接:
How do I delete from multiple tables using INNER JOIN in SQL server

检查这些链接以了解如何使用SP_Execute在临时表中插入行:
Sql server - how to insert single row into temporary table?
Insert multiple rows into temp table with one command in SQL2005
希望这些对你有所帮助..

答案 1 :(得分:0)

首先,您应该确定TBLA的主键字段。我认为PK是FLDA。

当您从临时表中存在的TBLA行中删除时,右侧sintax为:

DELETE FROM TBLA
WHERE FLDA IN 
   (SELECT ##TempTable.FLDA 
   FROM ##TempTable)

使用sql server解决此问题的一种更优雅的方法是MERGE语句:

MERGE 
    INTO  TBLA  AS target
    USING (Select * from ##TempTable)
    ON TBLA.FLDA = ##TempTable.FLDA
    [ WHEN MATCHED [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [ ...n ]
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
        THEN <merge_not_matched> ]
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [ ...n ]
    [ <output_clause> ]
    [ OPTION ( <query_hint> [ ,...n ] ) ] 

<强>被修改 我看到了你更详细的问题。

执行时:

DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)

所有数据都将被删除,因为条件总是返回True。

可以将TBLA中的所有表字段连接起来进行比较,以便连接来自## TempTable的所有表字段。