【问题标题】:How do I copy data from one table to another table on another server?如何将数据从一个表复制到另一台服务器上的另一个表?
【发布时间】:2013-03-26 14:31:34
【问题描述】:

我有一个简单的 SQL,在生产数据库上找到大约 3000 行:

SELECT *
FROM [CONTOSO].[BATID] (NOLOCK)
WHERE COMPANYNO = 1
AND MEASURINGPOINT = '592-98901_NPT'
AND TIMESERIESNO = 1
AND DATE_TIME >= '2013-01-31 23:00:00'
AND DATE_TIME <= '2013-02-28 22:59:00'
ORDER BY DATE_TIME

有什么方法可以将输出转换为某种大的“INSERT INTO ....”-sql,将这些数据插入到同一个表中。然后我就可以轻松地将 sql 复制到另一个 SQL Server Management Studio 窗口并执行它。

【问题讨论】:

  • 到目前为止,最简单的方法是,如果您有权访问(并且被允许)这样做,则链接两个服务器,然后只需使用普通插入即可。

标签: sql sql-server


【解决方案1】:

如果您的服务器未连接,您可以使用SSMS import/ export wizard。此导出会创建一个数据文件,然后您可以将其导入远程服务器。

【讨论】:

  • 谢谢。现在这就是我一直在寻找的。我在 Notepad++ 中做了一些格式化,将每一行转换为“INSERT INTO ...”行。
  • 不是一个屁,但如果你写了“写代码的代码”,那么将来你可以绕过你在notepad++中所做的手动步骤。我想这取决于这是一次性的还是您必须一遍又一遍地做的事情。恕我直言,调整“编写代码的代码”更容易。
【解决方案2】:

使用INSERT INTO..SELECT

INSERT INTO TableName (collName1, colName2,...)
SELECT * -- this should match to the names of column define in the INSERT clause
FROM [CONTOSO].[BATID] (NOLOCK)
WHERE COMPANYNO = 1
AND MEASURINGPOINT = '592-98901_NPT'
AND TIMESERIESNO = 1
AND DATE_TIME >= '2013-01-31 23:00:00'
AND DATE_TIME <= '2013-02-28 22:59:00'

【讨论】:

  • 不确定这是否可行 - 这假设您在运行 SQL 时可以看到对其他服务器的访问。
【解决方案3】:

如果在您的 SQL 版本中可以使用 create table as select ,那么您可以使用这个:

Create table tab_name AS
 SELECT... your query...

【讨论】:

    【解决方案4】:

    SSMS Tools Pack 有一个很棒的 Generate Insert Statements 功能: http://www.ssmstoolspack.com/ 它允许您轻松输入 where 子句以获取您想要导出的数据。 这曾经是完全免费的,但现在如果与 SSMS 2012+ 一起使用则需要支付少量费用

    如果你有更多的钱并且经常需要做这种事情,那么 Red Gate 的 SQL 数据比较是一个很棒的工具: https://www.red-gate.com/products/sql-development/sql-data-compare/

    【讨论】:

      【解决方案5】:

      您也可以创建Linked Server,然后将数据从一个表复制到链接服务器上的另一个表。

      sp_addlinkedserver  
        @server= N'NameofLinkedServer',
        @srvproduct= N'',
        @provider= N'SQLNCLI',
        @datasrc= N'YourRemoteServer';
      
      sp_addlinkedsrvlogin
        @rmtsrvname = 'NameofLinkedServer' ,
        @useself = 'FALSE' ,
        @locallogin = 'local_login' ,
        @rmtuser = 'remote_login' ,
        @rmtpassword = 'remote_password'
      

      创建Linked Server后执行此INSERT语句

      INSERT [NameofLinkedServer].[your_databaseName].[CONTOSO].[BATID](Column1, Column2, ...)
      SELECT (Column1, Column2, ...)
      FROM [CONTOSO].[BATID] (NOLOCK)
      WHERE COMPANYNO = 1
      AND MEASURINGPOINT = '592-98901_NPT'
      AND TIMESERIESNO = 1
      AND DATE_TIME >= '2013-01-31 23:00:00'
      AND DATE_TIME <= '2013-02-28 22:59:00'
      ORDER BY DATE_TIME
      

      详情请参阅MSDN docs

      【讨论】:

        【解决方案6】:

        您可以编写代码来创建代码。

        我在这里为“MembershipProvider”数据库完成了它: http://granadacoder.wordpress.com/2007/11/29/membershipprovider-helper-to-transfer-data/

        您可以根据需要进行修改。

        注意双引号和单引号,他们会在计划中使用活动扳手。

        这里是更大的代码示例的预览:

        注意,它创建的代码可以在第二个 sql server 上运行。

            select 
            'INSERT INTO dbo.aspnet_Applications ( ApplicationName,LoweredApplicationName,ApplicationId,[Description] ) values ('  as [--Comment], 
            char(39) + t1.ApplicationName + char(39) ,  ',' , 
            char(39) + t1.LoweredApplicationName + char(39) ,  ',' , 
            char(39) + convert(varchar(38)  , t1.ApplicationId ) + char(39) ,  ',' , 
            char(39) + t1.Description + char(39) 
            , ')'
             FROM
                dbo.aspnet_Applications t1
        

        这是一个 Northwind 示例,它处理 CompanyName 和 Address 列中的单引号,并对 PrimaryKey 进行“不存在”检查。请注意,此表没有任何整数/数字,但只需删除单引号即可。如果您想检查空值,这是一个简单的 case 语句,如传真列中所示。

        Select 'INSERT INTO dbo.Customers ( CustomerID,CompanyName,ContactName,ContactTitle,[Address],City,Region,PostalCode,Country,Phone,Fax ) '   as [--Comment], 
        'SELECT ' , 
        char(39) + t1.CustomerID + char(39) ,  ',' , 
        char(39) + REPLACE(t1.CompanyName , char(39) , char(39) + '+' + 'char(39)' + '+' +  char(39) ) + char(39) ,  ',' , 
        char(39) + t1.ContactName + char(39) ,  ',' , 
        char(39) + t1.ContactTitle + char(39) ,  ',' , 
        char(39) + REPLACE(t1.[Address] , char(39) , char(39) + '+' + 'char(39)' + '+' +  char(39) ) + char(39) ,  ',' , 
        char(39) + t1.City + char(39) ,  ',' , 
        char(39) + t1.Region + char(39) ,  ',' , 
        char(39) + t1.PostalCode + char(39) ,  ',' , 
        char(39) + t1.Country + char(39) ,  ',' , 
        char(39) + t1.Phone + char(39) ,  ',' , 
        Fax = case
            when t1.Fax is null then 'null'
            else char(39) + t1.[Fax] + char(39) 
            end
        , ' Where not exists (select null from dbo.Customers innerC where innerC.CustomerID = ' + char(39) + t1.CustomerID + char(39) + ')'
         FROM
        dbo.Customers t1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多