Sql 如何将数据从一个表复制到另一台服务器上的另一个表?
我有一个简单的SQL,在生产数据库上可以找到大约3000行: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
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