2011-12-01 48 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