2013-03-26 57 views
3

我有一個簡單的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窗口並執行它。

+1

目前最簡單的,如果你有機會(並允許),這樣做,是爲了鏈接兩臺服務器,然後只需使用普通的插入即可。 – 2013-03-26 14:51:21

回答

3

如果您的服務器連接不上,你可以使用SSMS import/ export wizard。此導出將創建一個數據文件,然後您可以在遠程服務器上導入該文件。

+0

謝謝。目前這是我正在尋找的。我在Notepad ++中做了一些格式化處理,將每一行轉換成一個'INSERT INTO ...'行。 – 2013-03-26 15:10:13

+0

不是一個屁股,但是如果你寫了「編寫代碼的代碼」,那麼將來你可以繞過你在記事本++中做的手動步驟。我想這取決於這是一次性還是你一定要做的事情。它更容易調整「代碼寫入代碼」恕我直言。 – granadaCoder 2013-03-26 15:13:06

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' 
+0

不確定這是否行得通 - 假設您可以在運行SQL時看到其他服務器的訪問權限。 – 2013-03-26 14:34:01

1

如果創建表的選擇可在你的SQL的版本,那麼你可以使用這個:

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

您可以編寫創建代碼的代碼。

我已經做到了爲這裏的‘的MembershipProvider’數據庫: http://granadacoder.wordpress.com/2007/11/29/membershipprovider-helper-to-transfer-data/

您可以修改,以滿足您的需求。

觀看雙引號和單引號,他們會在計劃中拋出一隻猴子扳手。

這是更大的代碼示例的預覽:

注意,它會創建一個可以在第二個SQL服務器上運行的代碼。

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 

這裏是一個羅斯文例如,處理的公司名稱和地址列單引號,並具有「哪裏都不存在」對的PrimaryKey檢查。請注意,此表沒有任何整數/數字,但只需刪除單引號即可。如果您想檢查空值,這是傳真列中看到的一個簡單的案例陳述。你

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 
0

還可以創建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

相關問題