在最近的項目中由於出帳和計費的數據不在同一臺服務器上,需要用到跨庫查詢.
現把查詢語句給出
select * into tmptable from openquery([demo],''select * from demoinfo.dbo.出帳(''200812''')''),
這裏需要對遠程服務器進行註冊
註冊方式如下:
Exec sp_droplinkedsrvlogin DBVIP,Null
Exec sp_dropserver DBVIP
EXEC sp_addlinkedserver
@server='DBVIP',--被訪問的服務器別名
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='Server2' --要訪問的服務器
EXEC sp_addlinkedsrvlogin
'DBVIP', --被訪問的服務器別名
'false',
NULL,
'sa', --帳號
'thankyoubobby' --密碼
Select * from DBVIP.pubs.dbo.orders
如果你要訪問的遠程服務器不能使用機器名進行訪問的話,那麼需要使用ip地址替換Server2來實現.
參考資料:http://www.cnitblog.com/MartinYao/archive/2007/04/12/25647.aspx
在具體使用中
SELECT * FROM OPENQUERY(demo ,'select * from tbdemo' )
UPDATE OPENQUERY (demo, 'SELECT id FROM tbdemo WHERE id = 101')
SET name = 'hello';
INSERT OPENQUERY (demo, 'SELECT id FROM tbdemo')
VALUES ('hello');
DELETE OPENQUERY (demo, 'SELECT id FROM tbdemo WHERE name = ''hello''');
如果數據量比較小,那麼ok,沒有什麼事了.如果數據量比較大,查詢時間超長,報如下錯誤:
已以用戶 SQLDATA 的身份執行。 鏈接服務器 "demo" 的 OLE DB 訪問接口 "SQLNCLI" 報錯。由於達到了資源限制,提供程序終止了執行。 [SQLSTATE 42000] (錯誤 7399) 無法對鏈接服務器 "demo" 的 OLE DB 訪問接口 "SQLNCLI" 執行查詢"''select * from demoinfo.dbo.出帳(''200812''')"。 [SQLSTATE 42000] (錯誤 7320). 該步驟失敗。
Server:Msg 7399, Level 16, State 1, Line 1 OLE DB provider 'SQLOLEDB' reported an error.Execution terminated by the provider because a resource limit was reached.[OLE/DB provider returned message:Timeout expired]
那麼首先在查詢中使用DBCC TRACEON (7300, 3604) 語句,然後執行查詢,則您可能會在錯誤信息中看到其他信息
我在使用了之後返回的錯誤信息是:
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
鏈接服務器"demo"的 OLE DB 訪問接口 "SQLNCLI" 返回了消息 "查詢超時已過期"。
消息 7399,級別 16,狀態 1,第 1 行
鏈接服務器 "demo" 的 OLE DB 訪問接口 "SQLNCLI" 報錯。由於達到了資源限制,提供程序終止了執行。
消息 7320,級別 16,狀態 2,第 1 行
無法對鏈接服務器 "demo" 的 OLE DB 訪問接口 "SQLNCLI" 執行查詢''select * from demoinfo.dbo.出帳(''200812''')"。
則對超時時間進行修改.
使用以下代碼將遠程查詢超時值設置爲 0(無限等待): sp_configure 'remote query timeout', 0
go
reconfigure with override
go
參考資料:http://support.microsoft.com/kb/314530