2008-09-24 74 views
50

如果我需要將存儲過程(SP)從一個SQL Server複製到另一個SQL Server,我右鍵單擊SSMS中的SP並選擇腳本存儲過程爲> CREATE>新建查詢編輯器窗口。然後,通過右鍵單擊該窗口並選擇連接>更改連接...,然後選擇新服務器和F5以在新服務器上運行創建,從而更改連接。什麼是連接到另一個SQL Server的T-SQL語法?

所以我的問題是「什麼是連接到另一個SQL Server的T-SQL語法?」以便我可以將它粘貼到創建腳本的頂部,然後使用F5來運行它,然後切換到新服務器並運行創建腳本。

在輸入問題時,我意識到如果我把你的背景告訴了我想要做的事情,那麼你可能會想出一個更快更好的方式來完成這個任務。

回答

47

另外,確保當你寫涉及鏈接的服務器查詢時,您包括括號中是這樣的:

SELECT * FROM [LinkedServer].[RemoteDatabase].[User].[Table] 

我發現至少在2000/2005年[]括號是必要的,至少在服務器名稱周圍。

2

嘗試創建一個鏈接的服務器(你可以用sp_addlinkedserver做),然後使用OPENQUERY

+0

韋恩 - 如果我正確理解你的建議,那麼這將執行駐留在server2 server1上的SP權利?它不會在server2上創建相同的SP嗎? – Guy 2008-09-24 04:54:35

+0

它在server1上執行一個sp,打開到server2的鏈接。然後,您可以通過查詢或調用server2上的某些東西來進行傳遞。 – Wayne 2008-09-24 05:08:46

27

更新:用於連接到另一個SQL Server和執行SQL語句,你必須使用sqlcmd Utility。這通常在批處理文件中完成。 如果您想在管理工作室內執行它,您可以將它與xmp_cmdshell結合使用。


一種方法是配置一個linked server。那麼您可以將鏈接的服務器和數據庫名稱追加到表名中。 (從linkedserver.database.dbo.TableName選擇*)

USE master 
GO 
EXEC sp_addlinkedserver 
    'SEATTLESales', 
    N'SQL Server' 
GO 
+0

這實際上是對特定問題的正確答案。或者說,首先確保其他服務器已鏈接,因此可以查詢,然後您可以按照Codewerks的說明選擇其他服務器。 – mahalie 2011-01-21 01:40:33

5

如果我想解釋一下這個問題 - 是否有可能在DDL中爲查詢執行選擇服務器上下文 - 答案是否定的。只有數據庫上下文可以用USE以編程方式選擇。 (已經預先選擇了外部的服務器上下文)

鏈接服務器和OPEN QUERY可以訪問DDL,但需要重寫代碼以封裝爲字符串 - 使開發/調試變得困難。

或者,您可以使用外部驅動程序來獲取SQL文件以通過OPEN QUERY發送​​到遠程服務器。但是在大多數情況下,您可能首先直接連接到服務器以評估DDL。

0

如果可能,請查看SSIS(SQL Server Integration Services)。我正在用這個工具包弄溼我的腳,但已經在超過40多臺服務器上循環並準備造成各種破壞;)

+1

這並沒有真正回答他的問題。 – 2013-12-05 01:24:48

73

在SQL Server Management Studio中,從查詢菜單打開SQLCMD模式。 然後在你的腳本如下

:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password] 

上,鍵入命令如果要連接到多臺服務器,一定要連接之間插入GO; otherwise your T-SQL won't execute on the server you're thinking it will.

+3

如果您連接到多個服務器,則應在切換服務器之前添加「GO」,否則您的sql語句將針對錯誤的服務器運行。 http://www.sqlmatters.com/Articles/Changing%20the%20SQL%20Server%20connection%20within%20an%20SSMS%20Query%20Windows%20using%20SQLCMD%20Mode.aspx – 2014-04-07 15:59:06

4

每當我們試圖從另一臺服務器上檢索任何數據時,我們需要兩個步驟。

第一步:

-- Server one scalar variable 
DECLARE @SERVER VARCHAR(MAX) 
--Oracle is the server to which we want to connect 
EXEC SP_ADDLINKEDSERVER @SERVER='ORACLE' 

第二步:

--DBO is the owner name to know table owner name execute (SP_HELP TABLENAME)  
SELECT * INTO DESTINATION_TABLE_NAME 
FROM ORACLE.SOURCE_DATABASENAME.DBO.SOURCE_TABLE 
1

我的C驅動器上我先創建一個txt文件,以創建一個新表。你可以使用你想要什麼都在這個文本文件

在這種情況下,文本文件被稱爲「Bedrijf.txt」

內容:

Print 'START(A) create table' 

GO 1 

If not EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = 'Bedrijf' 
) 
BEGIN 
CREATE TABLE [dbo].[Bedrijf] (
[IDBedrijf] [varchar] (38) NOT NULL , 
[logo] [varbinary] (max) NULL , 
[VolledigeHandelsnaam] [varchar] (100) NULL 
) ON [PRIMARY] 

保存它

然後我創建一個名爲「Bedrijf.bat」和擴展bat的其他txt文件。 它的內容:

OSQL.EXE -U Username -P Password -S IPaddress -i C:Bedrijf.txt -o C:Bedrijf.out -d myDatabaseName 

保存,並從資源管理器中雙擊執行

結果將名爲「Bedrijf.out」

它被保存在一個txt文件C驅動器上顯示

1> 2> 3> START(A) create table 

如果一切順利

這就是我t