1

別のデータベースの別のテーブルの行を使用して、あるテーブルから行を挿入するコードを実行しようとしています。
私はこれを持っていました:

INSERT [testDB].[dbo].[table1]
SELECT * FROM 
[sourceDB].[dbo].[table1]
LEFT OUTER JOIN [testDB].[dbo].[table1] 
ON [sourceDB].[dbo].[table1].[PKcolumn] = [testDB].[dbo].[table1].[PKcolumn]
WHERE [testDB].[dbo].[table1].[PKcolumn] IS NULL

ただし、相関名を追加するように言われたので、これを作成しました。

INSERT test
SELECT * FROM 
[sourceDB].[dbo].[table1] as source
LEFT OUTER JOIN 
[testDB].[dbo].[table1] as test
ON 
source.[PKcolumn] = test.[PKcolumn]
WHERE test.[PKcolumn] IS NULL

私はこれをエラーメッセージとして受け取りました:

メッセージ 208、レベル 16、状態 1、行 1 無効なオブジェクト名 'test'。

私が間違っていることを誰かが知っていますか?

4

2 に答える 2

1

最初の行では、次のように実際のテーブル名を使用する必要があります

insert into testDB.dbo.table1

SQLServer はその場所でエイリアスまたは相関名を受け入れません。テストで確認しました。

ただし、クエリの後半でエイリアスを使用することもできます。列がどのテーブルから取得されているかというあいまいさを避けるために、エイリアスを使用すると非常に便利です。

このクエリで考えられるもう 1 つの問題は、select * の使用です。これにより、sourcedb.dbo.table1 と testdb.dbo.table1 から結合された列セットが testdb.dbo.table1 に挿入されます。それはうまくいきません。

select * の代わりに...と言うことができます (source と test の列がまったく同じであると仮定します)

select source.*

または、次のように特定の列を呼び出すことができます...

select source.colA, source.col3, etc....

私はあなたのコラムの名前を知りません。

于 2012-07-31T18:36:42.810 に答える
0
INSERT test 
SELECT *
FROM  [sourceDB].[dbo].[table1] as source 
LEFT OUTER JOIN  [testDB].[dbo].[table1] as test 
   ON  source.[PKcolumn] = test.[PKcolumn] 
WHERE test.[PKcolumn] IS NULL 

これの何が悪いのか話しましょう。最初の選択*には、ソースからのすべての列が含まれ、その中にテストが含まれます。これは、挿入する予定のテーブルよりも明らかに多くの列です。いくつかの理由から、insert ステートメントで select * を使用することは決して受け入れられません。

まず、誰かが列の順序またはテーブルの構造を変更すると、挿入が壊れます。第二に、このような結合がある場合、列の数が間違っています。第三に、元の順序が異なる場合、同じ列を持っていても、データを磨耗した列に入れることができます。それらが同様のデータ型であり、データが適合するか暗黙的に変換できる場合、データベースはこれを停止しません。

次に、select の別名を挿入の宛先として使用することはできません。実際のテーブル名を参照する必要があります。

最後に、すべての挿入で列リストを使用しないのは、非常に不適切な方法です。これはメンテナンスに役立ち、選択した列が挿入内の列と一致するかどうかを確認できます。さらに、自動生成されたフィールドがある場合は、列リストを使用する必要があります。そうしないと、自動生成されたフィールドに挿入しようとするため、エラーが発生します。

したがって、ステートメントは次のようになります。

INSERT [testDB].[dbo].[table1] (field1, field2, field3)
SELECT source.field1, source.field2, source.field3
FROM  [sourceDB].[dbo].[table1] as source 
LEFT OUTER JOIN  [testDB].[dbo].[table1] as test 
   ON  source.[PKcolumn] = test.[PKcolumn] 
WHERE test.[PKcolumn] IS NULL 

または(おそらくより効率的です。特定の状況でテストする必要があります):

INSERT [testDB].[dbo].[table1] (field1, field2, field3)
SELECT source.field1, source.field2, source.field3
FROM  [sourceDB].[dbo].[table1] as source 
WHERE NOT EXISTS (SELECT * FROM testDB].[dbo].[table1] test 
                  WHERE  source.[PKcolumn]=test.[PKcolumn])
于 2012-07-31T19:21:48.453 に答える