2

私はまだ T-SQL と SQL 2005 にかなり慣れていません。database1 のテーブルから、database2 の同一のテーブル (必要な列のみが欠落している) に整数の列をインポートする必要があります。どちらも sql 2005 データベースです。Server Management Studio で組み込みのインポート コマンドを試しましたが、テーブル全体をコピーする必要があります。これにより、制約と「読み取り専用」列 (sql2005 で「読み取り専用」が意味するものは何でも) が原因でエラーが発生します。単一の列を取得してテーブルにコピーしたいだけです。

これを行う簡単な方法があるはずです。何かのようなもの:

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
4

6 に答える 6

5

テーブルの最後に新しい行を挿入しようとするため、挿入はできません。あなたがやろうとしているように聞こえるのは、既存の行の最後に列を追加することです。

構文が正確に正しいかどうかはわかりませんが、理解できれば、これで目的が果たせます。

  1. database2 に NULL を許可する列を作成します。

  2. 更新を実行します。

    UPDATE database2.dbo.tablename SET database2.dbo.tablename.colname = database1.dbo.tablename.colname FROM database2.dbo.tablename INNER JOIN database1.dbo.tablename ON database2.dbo.tablename.keycol = database1.dbo.tablename.キーコル

于 2008-09-09T17:18:52.877 に答える
2

両方のデータベースが同じサーバー上にある限り、これによく似た簡単な方法があります。完全修飾名は dbname.owner.table です。通常、所有者は dbo で、「.dbo」のショートカットがあります。これは「..」なので...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable
于 2008-09-09T17:15:06.770 に答える
2

存在しない場合は、最初に列を作成します。

ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed

Sql Server 2005 を使用しているため、新しいMERGEステートメントを使用できます。 MERGEステートメントには、ソースから行が欠落している (挿入を実行できる)、宛先から行が欠落している (削除を実行できる)、行の一致 (更新を実行できる)、およびすべてがアトミックに実行されるなど、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 ステートメントは、あなたのようなケースを解決するために導入されました。これを使用することをお勧めします。複雑さを増すことなく、1 つのステートメントで MERGE と同じことを基本的に達成する、複数の SQL バッチ ステートメントを使用するソリューションよりもはるかに強力です。

于 2008-09-09T17:31:10.367 に答える
1

MERGE は SQL 2008 でのみ使用でき、SQL 2005 では使用できません

于 2008-12-05T11:14:00.300 に答える
1

カーソルを使用することもできます。最初のテーブルのすべてのレコードを反復処理し、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
于 2008-09-09T17:23:05.110 に答える
0

Test2.dbo.MyTable (MyValue) に挿入し、Test1.dbo.MyTable から MyValue を選択します。

これは大前提です。まず、宛先データベースが空であること。2 つ目は、他の列が null 許容であることです。代わりに更新が必要な場合があります。そのためには、共通の鍵が必要です。

于 2008-09-09T17:13:33.107 に答える