-1

最初に質問を忘れる、

私は私の質問についてもっと私の記憶された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:一時テーブルから*を選択してTBLAに挿入する

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

EXEC sp_ExecuteSql @DumpSql ;

問題としてステップ2の詳細:

基本的に、削除文を実行した後、私は自分のデータのすべてが欠落していることがわかりました。DELETE FROM TBLA...

例えばsenario

deleteステートメントを作成しようとする前に、単に選択を試みます。##TempTable値、それは正しいです。ああ、それだけで2011-11-04データを持っている

実は私のTBLA現在すでに2011-11-03と2011-11-02のデータがあります。

シモンズ:私は実際には日付の値でデータを選択しています。

これは私が上記のSQL、その成功を走った...

そして続けて、私は自分のTBLA結果を見てください。ああ、神様!!!!その唯一の2011-11-04データ...残りはどこですか?

その点に注意してください:

上記のSQLはsp_executesqlを使用した私の動的な格納されたprodのほんの一部です。 私の実際のデータは私が処理する必要があるテーブルの300を持っており、適切に合計300のテーブルが異なるユニークなindentityだから私はできませんでしたSelect * From ##Temptable Where id=something

これがもっと明確になることを願います

ありがとう、あなたの助けを感謝します

よろしく:

LiangCk

2 답변


2

これをチェックして: where条件で副照会を使用してmytableから行を削除します。

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

日付に応じて削除する一意の値を探している場合は、一時テーブルに一意の値を作成してから、削除操作を実行します。

次に、結合操作を基にして削除操作を探している場合は、次のようにします。 その後、このリンクに従ってください:

SQLサーバーでINNER JOINを使用して複数のテーブルから削除する方法

SP_Executeを使用して一時テーブルに行を挿入する方法を知るためにこれらのリンクをチェックしてください:

SQL Serverの - 一時テーブルに1行を挿入する方法?

SQL2005で1つのコマンドで複数の行を一時テーブルに挿入する

これらが少しでも役立つことを願っています..


  • 返信いただきありがとうございます、しかし残念なことにそれは動的に適用される方法であるため、IDで識別することはできません。と問題が異なる種類のテーブルがあります。私はストアドプロッドの中でこのSQLを実行しました - Worgon
  • 私の質問をもう一度見るのを手伝ってください。 - Worgon
  • 私はあなたがこの問題を解決するためにさらに進むのを助けるであろういくつかのリンクを更新しました.. - Niranjan Singh

0

まず最初に、TBLAの主キーフィールドを特定します。 PKはFLDAだと思います。

一時テーブルに存在するTBLA行を削除すると、正しいシンタックスは次のようになります。

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

SQLサーバーでこれを解決するためのよりエレガントな方法は、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)

where condition allwaysがTrueを返すので、すべてのデータは削除されます。

回避策は、TBLAからのすべてのテーブルフィールドを連結して、## TempTableからのすべてのテーブルフィールドを連結することと比較することです。


  • 私の質問をもう一度見るのを手伝ってください。 - Worgon

リンクされた質問


関連する質問

最近の質問