Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将数据从一个表复制到另一台服务器上的另一个表?_Sql_Sql Server - Fatal编程技术网

Sql 如何将数据从一个表复制到另一台服务器上的另一个表?

Sql 如何将数据从一个表复制到另一台服务器上的另一个表?,sql,sql-server,Sql,Sql Server,我有一个简单的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_TI

我有一个简单的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窗口并执行它。

使用INSERT into..选择


如果服务器未连接,则可以使用。此导出将创建一个数据文件,然后您可以在远程服务器上导入该文件。

如果您的SQL版本中提供了“创建表为选择”,则您可以使用以下方法:

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

SSMS Tools Pack具有强大的生成插入语句功能: 它允许您轻松地输入where子句以仅获取要导出的数据。 这过去是完全免费的,但现在如果与SSMS 2012一起使用,则需要少量费用+

如果您有更多的钱并且需要经常做这类事情,那么RedGate的SQL数据比较是一个很好的工具:
您可以编写创建代码的代码

我已经在这里为MembershipProvider数据库完成了这项工作:

您可以根据需要进行修改

看看双引号和单引号,他们会在计划中捣乱的

下面是更大代码示例的预览:

注意,它创建了可以在第二台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进行where not exists检查。注意,此表没有任何整数/数字,但只需删除单引号即可。如果要检查空值,这是一个简单的case语句,如Fax列中所示

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
您还可以创建数据,然后将数据从一个表复制到链接服务器上的另一个表

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'
创建后,执行此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

有关详细信息,请参阅

不确定是否可行-这假设您在运行SQL时可以看到访问另一台服务器的权限。到目前为止,最简单的方法是,如果您有访问权限并且允许访问,将两台服务器链接起来,然后只使用普通的插入。谢谢。现在这就是我想要的。我在Notepad++中做了一些格式化,将每一行转换为“插入到…”行。这不是为了成为一个屁股,但如果您编写了编写代码的代码,那么将来您可以绕过在Notepad++中执行的手动步骤。我想这取决于这是一次性的还是你必须反复做的事情。更容易调整编写IMHO代码的代码。
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