質問

同じ構造と非常に多数のフィールド(約1000)を備えた2つのテーブルがあります。 2つの操作を実行する必要があります1)2番目のテーブルからすべての行を拳に挿入します。例:

INSERT INTO [1607348182]
SELECT * 
FROM _tmp_1607348182;

2)2番目のテーブルから最初のテーブルを更新しますが、更新のためにアップデートするための適切なSQL構文を見つけることができません。

次のようなクエリ:

Update [1607348182]
set [1607348182].* = tmp.*
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid

また

Update [1607348182]
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid

無効です。

役に立ちましたか?

解決

動的SQLを使用して変数で更新ステートメントを構築することなくこれを達成できるかどうかはわかりません。

このステートメントは、あなたが入れたテーブル名に基づいて列のリストを返します。

select name from syscolumns
where [id] = (select [id] from sysobjects where name = 'tablename')

ここでループを避けることができるかどうかはわかりません....上記の結果をカーソルにロードしてから、そこからクエリを作成する必要があります。 Psuedo Coded:

set @query = 'update [1607348182] set '
load cursor --(we will use @name to hold the column name)
while stillrecordsincursor
set @query = @query + @name + ' = tmp_[1607348182]. ' +@name + ','
load next value from cursor
loop!

クエリがループ内で構築されている場合は、exec sp_executesql @queryを使用してください。

ほんの少しの警告...このようなループにダイナミックSQLを構築すると、少し混乱する可能性があります。トラブルシューティングのために、select @queryをループに入れて、 @queryが構築されるのを見てください。

編集:アップデートで1000行すべてを一度に実行できるかどうかはわかりません... @Queryも成長できるサイズに論理的な制限(Varchar(8000)?)があります。一度に50列を処理するように、コードを分割する必要がある場合があります。 syscolumnsの列を選択したステートメントをIDを使用して温度テーブルに配置し、ダイナミックSQLを構築して、一度に20列(または50列)を更新します。

もう1つの選択肢は、Excelを使用してこれをマスビルドすることです。列を選択して、結果をスプレッドシートの列Aにコピーします。 column b、tmp。[12331312]にput '=列Cでは、列Aを列Dにコピーし、列eにコンマをコピーします。スプレッドシート全体をメモ帳にコピーすると、更新ステートメントの列が作成されている必要があります。これがワンショットイベントである場合、悪い解決策ではありません。これを進行中のソリューションとして頼っているかどうかはわかりません。

他のヒント

TEMPのIDがあるマスターテーブルからすべてを削除し、新しいデータで挿入を行うことは機能しますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top