最初に質問を忘れる、
私は私の質問についてもっと私の記憶された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
これをチェックして: where条件で副照会を使用してmytableから行を削除します。
DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2)
日付に応じて削除する一意の値を探している場合は、一時テーブルに一意の値を作成してから、削除操作を実行します。
次に、結合操作を基にして削除操作を探している場合は、次のようにします。
その後、このリンクに従ってください:
SQLサーバーでINNER JOINを使用して複数のテーブルから削除する方法
SP_Executeを使用して一時テーブルに行を挿入する方法を知るためにこれらのリンクをチェックしてください:
SQL Serverの - 一時テーブルに1行を挿入する方法?
SQL2005で1つのコマンドで複数の行を一時テーブルに挿入する
これらが少しでも役立つことを願っています..
まず最初に、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からのすべてのテーブルフィールドを連結することと比較することです。