8

同じ構造で非常に多くのフィールド(約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

無効です。

4

2 に答える 2

5

一時的にIDを持つマスターテーブルからすべてを削除してから、新しいデータを挿入することはできますか?

于 2010-10-08T14:59:51.560 に答える
3

動的SQLを使用して変数の更新ステートメントを作成せずにこれを実行できるかどうかはわかりません。

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

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

ここでループを回避できるかどうかわからない....上からの結果をカーソルにロードしてから、そこからクエリを作成する必要があります。疑似コード化:

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!

クエリがループ内で構築されたら、execsp_executesql@queryを使用します。

ちょっとした警告...このようなループで動的SQLを構築すると、少し混乱する可能性があります。トラブルシューティングのために、select @queryをループに入れて、@queryがビルドされるのを確認してください。

編集:更新で1000行すべてを一度に実行できるかどうかわからない... @ queryも大きくなる可能性のあるサイズには論理的な制限(varchar(8000)?)があります。一度に50列を処理するように、コードを分割する必要がある場合があります。syscolumns selectステートメントの列をIDを持つ一時テーブルに配置し、動的SQLを構築して、一度に20列(または50?)を更新するようにします。

もう1つの方法は、Excelを使用してこれを大量に構築することです。列を選択して、結果をスプレッドシートの列aにコピーします。'=を列b、tmpに入れます。[12331312] 列cで、列aを列Dにコピーし、コンマを列eにコピーします。スプレッドシート全体をメモ帳にコピーすると、更新ステートメントの列が作成されます。これがワンショットイベントである場合、悪い解決策ではありません。進行中の解決策としてこれに依存するかどうかはわかりません。

于 2010-10-08T16:21:04.897 に答える