OPENQUERY ( linked_server ,'query' )

linked_server

這是代表連結伺服器名稱的識別碼。

' query '

這是在連結伺服器中執行的查詢字串。 該字串的最大長度是 8 KB。


--OPENQUERY的基本用法

SELECT * FROM OPENQUERY([SANDY-VAIO]
      ,'SELECT * FROM Northwind.dbo.Customers')
若要傳遞變數,使用以下寫法將出現錯誤
--傳遞變數(錯誤寫法)
DECLARE @TSQL varchar(8000), @VAR char(2)
 SELECT  @VAR = 'A%'
 SELECT * FROM OPENQUERY([SANDY-VAIO] ,'SELECT * FROM Northwind.dbo.Customers 
                         WHERE CustomerID Like '''+  @VAR + '' )

--傳遞變數(正確寫法)
DECLARE @TSQL varchar(8000), @VAR char(2)
 SELECT  @VAR = 'A%'
 SELECT  @TSQL = 'SELECT * FROM OPENQUERY([SANDY-VAIO]
  ,''SELECT * FROM Northwind.dbo.Customers WHERE CustomerID Like ''''' + @VAR + ''''''')'
  EXEC (@TSQL)
  GO
若要避免多重層級的引號可利用sp_executesql 預存程序
--使用 Sp_executesql 預存程序
DECLARE @VAR char(2)
SELECT  @VAR = 'A%'
EXEC [SANDY-VAIO].master.dbo.sp_executesql
     N'SELECT * FROM Northwind.dbo.Customers WHERE CustomerID Like @state',
     N'@state char(2)',
     @VAR

 

依照資料表名稱的相同方式,在查詢的 FROM 子句中參考 OPENQUERY,即可取得資料集。這是大部分的使用者常用的方式,很少人會想到OpenQuery也可以拿來執行T-SQL與法中的新增刪除修改。關於這部分可參考:線上說明的範例。以下內容則是簡單列出網路上搜尋到的範例

--****************************
--* Example 1
--* Import all users into new table
--*****************************/

SELECT *INTO dbo.Users_Import
FROM OPENQUERY(remotelinkedservername, 'SELECT * FROM dbo.Users' )

--****************************
--* Example 2
--* Insert users that do not exist
--* into existing table
--*****************************/
INSERT INTO dbo.Users( UserID, UserName,  FirstName, LastName)
SELECT   UserID, UserName,FirstName,LastName
FROM OPENQUERY(remotelinkedservername, 'SELECT * FROM dbo.Users' ) ru
WHERE NOT EXISTS
(    SELECT 1   FROM dbo.Users
    WHERE UserID = ru.UserID  )

--/****************************
--* Example 3
--* Insert results from remote procedure
--* into new table
--*****************************/
SELECT *INTO dbo.List
FROM OPENQUERY(remotelinkedservername, 'set fmtonly off exec dbo.GetList')

補充:

 

若使用Sp_executesql出現以下錯誤訊息,請執行下列語法
訊息 7411,層級 16,狀態 1,行 3
並未為 RPC 設定伺服器 'SANDY-VAIO'。

EXEC sp_serveroption @server=N'SANDY-VAIO', @optname=N'rpc', @optvalue=N'true'
GO
EXEC sp_serveroption @server=N'SANDY-VAIO', @optname=N'rpc out', @optvalue=N'true'
GO
或手動修改連結物件的屬性

image

 

參考:
http://support.microsoft.com/kb/314520/zh-tw
blog.sqlauthority.com

http://sqlserverplanet.com/tsql/using-openquery

How to Add a Linked Server
Using OpenQuery
如何在 SQL 2005 中設定連結的伺服器(Linked Server)

arrow
arrow
    全站熱搜

    小草 發表在 痞客邦 留言(1) 人氣()