将一个数据库中的公共数据插入另一个

时间:2013-05-14 14:36:26

标签: sql sql-server database sql-server-2008 tsql

我有数据库X和数据库Y.X和Y有一些表和列具有相同的模式。数据库Y中没有数据。

为了将数据库X中的所有数据传输到表和列名相同的数据库Y,我可以编写哪些SQL / T-SQL?

谢谢

编辑:两个数据库都在同一台服务器上。我们不知道哪些表和列具有相同的名称,因此我无法手动插入每个表(例如,可能有100个具有相同名称的表和列)

3 个答案:

答案 0 :(得分:2)

如果您的数据库位于不同的服务器上:

  1. 您需要创建linked server
  2. INSERT INTO database.schema.Table SELECT * FROM server2.database.schema.Table
  3. 如果他们在同一台服务器上:

    1. INSERT INTO database.schema.Table SELECT * FROM database2.schema.Table

答案 1 :(得分: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中的表具有更多或更少的列,不同的数据类型,标识。我可能没有想到更多的选择,但想法应该没问题。

此外,我假设如果两个具有相同名称的表具有相同的列但不是全部,则不应对这些表进行传输。如果您还希望传输这些表以匹配列,则应调整一些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

答案 2 :(得分:0)

仍然不确定为什么不能使用SSIS导入导出向导将数据从一个数据库简单地传输到另一个数据库,相同的表模式?

右键单击要导出的数据库,任务,导出数据......