SQL 2005 データベース間で単一列をコピー
-
09-06-2019 - |
質問
私は T-SQL と SQL 2005 についてはまだ初心者です。整数の列をデータベース 1 のテーブルからデータベース 2 の同一のテーブル (必要な列だけが欠けている) にインポートする必要があります。どちらも SQL 2005 データベースです。Server Management Studio の組み込みインポート コマンドを試しましたが、テーブル全体をコピーする必要がありました。これにより、制約と「読み取り専用」列 (sql2005 での「読み取り専用」の意味) が原因でエラーが発生します。単一の列を取得してテーブルにコピーしたいだけです。
これを行う簡単な方法があるはずです。何かのようなもの:
INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
解決
テーブルの最後に新しい行を挿入しようとするため、挿入では実行されません。あなたがやろうとしているのは、既存の行の末尾に列を追加することです。
構文が正確に正しいかどうかはわかりませんが、理解できれば、これで目的のことが実行されます。
データベース2にNULLを許可する列を作成します。
更新を実行します。
Database2.dbo.tablenameの更新データベース2.dbo.tablename.colname = database1.dbo.tablename.colname from database2.dbo.tablename inenter niner join database1.dbo.tablename on database2.dbo.tablename.keycol = database1.dbo.tablename。 keycol
他のヒント
両方のデータベースが同じサーバー上にある限り、これとよく似た簡単な方法があります。完全に資格のある名前はdbname.owner.table-通常、所有者はDBOであり、「.dbo」のショートカットがあります。これは「..」です。
INSERT INTO Datbase1..MyTable
(ColumnList)
SELECT FieldsIWant
FROM Database2..MyTable
列が存在しない場合は、まず列を作成します。
ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed
SQL Server 2005 を使用しているため、新しい マージ 声明。の マージ ステートメントには、すべての状況を 1 つのステートメントで処理できるという利点があります。 ソースからの欠落行(挿入が可能)、宛先からの欠落行(削除が可能)、一致する行(更新が可能)など、すべてが 1 つのトランザクションでアトミックに実行されます。例:
MERGE database2..targetTable AS t
USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s
ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on
WHEN MATCHED THEN
UPDATE SET t.targetColumn = s.sourceColumn
WHEN NOT MATCHED THEN
INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])
MERGE ステートメントは、あなたのようなケースを解決するために導入されたものであり、これを使用することをお勧めします。基本的に MERGE が行うことと同じことを複雑さを増すことなく 1 つのステートメントで実行できる、複数の SQL バッチ ステートメントを使用するソリューションよりもはるかに強力です。
カーソルを使用することもできます。最初のテーブルのすべてのレコードを反復処理し、2 番目のテーブルに新しい行を追加したい場合は、次のような方法になります。
DECLARE @FirstField nvarchar(100)
DECLARE ACursor CURSOR FOR
SELECT FirstField FROM FirstTable
OPEN ACursor
FETCH NEXT FROM ACursor INTO @FirstField
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField )
FETCH NEXT FROM ACursor INTO @FirstField
END
CLOSE ACursor
DEALLOCATE ACursor
MERGE は SQL 2008 でのみ使用でき、SQL 2005 では使用できません。
Test2.dbo.MyTable (MyValue) に挿入 Test1.dbo.MyTable から MyValue を選択
これはかなりのことを想定しています。まず、宛先データベースが空であること。次に、他の列は NULL 可能です。代わりにアップデートが必要になる場合があります。これを行うには、共通キーが必要です。