2011-12-01 47 views
-1

忘掉这个问题首先选择的值删除,SQL服务器:从临时表

我觉得我应该做更清楚我的问题,提供我的存储刺中我的查询的一些例子

承担我有一个目的地表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表格进入TBLA

DECLARE @DumpSql NVARCHAR(MAX); 
SET @DumpSql = 'INSERT INTO TBLA 
       SELECT * FROM ##TempTable'; 

EXEC sp_ExecuteSql @DumpSql ; 

如步骤2中的问题更详细:

基本上,在我performe删除statment,我发现,我所有的数据丢失,似乎它只是执行第一行只有这DELETE FROM TBLA ......

例如塞纳里奥

之前,我尝试做了删除声明,我试着只是选择了##TempTable的值,这是正确的。哦,是的,它只有2011-11-04数据

其实我的TBLA目前已经有2011-11-03和2011-11-02的数据。 PS:我实际上是通过日期值来选择数据的。

这我跑上面的SQL,它的成功......

而且继续比,我打开我的TBLA和看到的结果。我的天啊!!!!它只有2011-11-04数据...其余的在哪里?

请注意:

这上面的SQL只是我dyamic存储督促所使用sp_executesql的.. 我的实际数据的一部分,我有表300必须处理和正确共有300台有不同独特indentity,所以我不能作出Select * From ##Temptable Where id=something

希望这更清楚的问题

感谢你,感谢你的帮助

方面S:

LiangCk

回答

2

检查:从MYTABLE在WHERE条件中使用子查询 删除行:

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

如果您正在寻找唯一值删除根据日期,那么创造独特价值在你的临时表中,然后像你一样执行删除操作。

其次,如果你正在寻找删除操作有所基于连接操作: 那么请点击此链接:
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
希望这些对你有所帮助。

+0

感谢您的回复,但不幸的是,它不能识别的ID,因为它是动态的方式应用。和问题有不同类型的表。 我运行这个SQL里面一个存储的产品 – Worgon

+0

请帮助再次看到我的问题..hopefully它现在更清晰 – Worgon

+0

我已更新一些链接,这将有助于您进一步解决此问题.. –

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的所有表字段进行连接进行比较。

+0

请帮助看到我的再次质疑..现在它更加清晰 – Worgon