-1

データベース X とデータベース Y があります。X と Y には、同じスキーマのテーブルと列がいくつかあります。データベース Y にはデータがありません。

テーブルと列の名前が同じであるデータベース X からデータベース Y にすべてのデータを転送するために、どのような SQL/T-SQL を記述できますか?

ありがとうございました

編集: 両方のデータベースが同じサーバー上にあります。同じ名前のテーブルと列がわからないため、各テーブルに手動で挿入することはできません (たとえば、同じ名前のテーブルと列が何百もある可能性があります)。

4

3 に答える 3

2

データベースが異なるサーバー上にある場合:

  1. リンク サーバーを作成する必要があります。
  2. INSERT INTO database.schema.Table SELECT * FROM server2.database.schema.Table

それらが同じサーバー上にある場合:

  1. INSERT INTO database.schema.Table SELECT * FROM database2.schema.Table
于 2013-05-14T14:38:19.163 に答える
2

質問から追加情報を受け取った後、これは少し興味深いものになったので、2 つのデータベースを比較sys.tablessys.columnsて INSERT/SELECT スクリプトを作成するタスクを実行するクエリを考え出そうとしました。

テスト設定:

USE X
CREATE TABLE t1 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t2 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t3 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t4 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t5 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t6 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t7 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t8 (co1 INT IDENTITY(1,1), col2 VARCHAR(10))

USE Y
CREATE TABLE t1 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t2 (co1 INT, col2 VARCHAR(10))
CREATE TABLE t3 (co1 VARCHAR(10), col2 VARCHAR(10))
CREATE TABLE t4 (co11 INT, col22 VARCHAR(10))
CREATE TABLE t5 (co11 INT, col2 VARCHAR(10))
CREATE TABLE t6 (co1 INT, col2 VARCHAR(10), col3 int)
CREATE TABLE t7 (co1 INT)
CREATE TABLE t8 (co1 INT IDENTITY(1,1), col2 VARCHAR(10))

カバーする必要があるいくつかの異なるシナリオを作成しようとしました。Y のテーブルには、追加または少ない列、異なるデータ型、ID があります。私が思いもよらなかったオプションがさらにあるかもしれませんが、アイデアは問題ないはずです。

また、同じ名前の2つのテーブルに同じ列がいくつかあるが、すべてではない場合、それらのテーブルに対して転送をまったく行うべきではないと想定しました。一致する列のためにこれらのテーブルも転送したい場合は、一部の JOINS を微調整する必要がありますが、Y の転送されていない列が NULL を許可するかどうかの問題もあります。

この場合、テーブル T1、T2、および T8 がコピーされます。

クエリ:

WITH CTE_X AS 
(
    SELECT  xt.object_id, xs.NAME + '.' + xt.NAME AS tblName, COUNT(*) AS colsNo FROM x.sys.tables xt
    INNER JOIN x.sys.columns xc ON xc.object_id = xt.object_id
    INNER JOIN x.sys.schemas xs ON xt.schema_id = xs.schema_id
    GROUP BY xt.object_id, xt.NAME, xs.NAME
)
,CTE_Y AS 
(
    SELECT  yt.object_id, ys.NAME + '.' + yt.NAME AS tblName, COUNT(*) AS colsNo FROM y.sys.tables yt
    INNER JOIN y.sys.columns yc ON yc.object_id = yt.object_id
    INNER JOIN y.sys.schemas ys ON yt.schema_id = ys.schema_id 
    GROUP BY yt.object_id, yt.NAME, ys.NAME
)
,CTE_XY AS 
(
    SELECT xt.object_id, xt.tblName, COUNT(*) colsNO FROM CTE_X xt
    INNER JOIN x.sys.columns xc ON xc.object_id = xt.object_id
    INNER JOIN CTE_Y yt ON xt.tblName = yt.tblName AND xt.colsNo = yt.colsNo 
    INNER JOIN y.sys.columns yc ON yc.object_id = yt.object_id AND xc.name = yc.name AND xc.user_type_id = yc.user_type_id AND xc.precision = yc.precision AND xc.scale = yc.scale
    GROUP BY xt.object_id, xt.tblName 
)
,CTE_Tables AS
(
    SELECT xy.object_id, xy.tblName
    FROM CTE_XY xy
    INNER JOIN CTE_X x ON xy.colsNO = x.colsNo AND xy.tblName = x.tblName 
)
,CTE_Columns AS 
(
    SELECT c.object_id, c.name, c.is_identity FROM CTE_Tables t
    INNER JOIN y.sys.columns c ON t.object_id = c.object_id
)
,CTE_ColConc AS 
(
    SELECT  OBJECT_ID, 
            STUFF((SELECT ', ' +  name 
                   FROM   CTE_Columns c2 
                   WHERE  c2.OBJECT_ID = c1.OBJECT_ID 
                   FOR XML PATH('')), 1, 2, '')  Cols,
            MAX(CAST(c1.is_identity AS INT)) AS hasIdentity
    FROM   CTE_Columns c1 
    GROUP  BY c1.object_id
)
SELECT 
      CASE WHEN hasIdentity = 1 THEN 'SET IDENTITY_INSERT Y.' + tblName + ' ON; ' ELSE '' END 
    + 'INSERT INTO Y.' + tblName + ' (' + Cols + ') SELECT '+ Cols + ' FROM X.'  + tblName + ';' 
    + CASE WHEN hasIdentity = 1 THEN 'SET IDENTITY_INSERT Y.' + tblName + ' OFF;' ELSE '' END
FROM CTE_Tables t 
INNER JOIN CTE_ColConc c ON c.OBJECT_ID = t.object_id

クエリの結果は、INSERT/SELECT ステートメントを含むスクリプトになります。次に、それを新しいクエリ ウィンドウにコピーし、実行する前に再確認できます。自動化されたプロセスが必要な場合は、結果を最後に #temp テーブルに取得し、sp_executesql行ごとに実行するだけです。

于 2013-05-15T08:19:13.897 に答える
0

SSIS インポート エクスポート ウィザードを使用して、あるデータベースから別の同じテーブル スキーマにデータを簡単に転送できない理由がまだわかりませんか?

データベースを右クリックしてエクスポート、タスク、データのエクスポート...

于 2013-05-15T16:29:46.047 に答える