ฉันจะเลือกข้อมูลในแบบสอบถามเดียวกันจากฐานข้อมูลที่แตกต่างกันสองแห่งที่อยู่บนเซิร์ฟเวอร์สองแห่งใน SQL Server ได้อย่างไร
ฉันจะเลือกข้อมูลในแบบสอบถามเดียวกันจากฐานข้อมูลที่แตกต่างกันสองแห่งที่อยู่บนเซิร์ฟเวอร์สองแห่งใน SQL Server ได้อย่างไร
คำตอบ:
สิ่งที่คุณกำลังมองหาคือเซิร์ฟเวอร์ที่เชื่อมโยง คุณสามารถเข้าถึงได้ใน SSMS จากตำแหน่งต่อไปนี้ในแผนผังของ Object Explorer:
Server Objects-->Linked Servers
หรือคุณสามารถใช้sp_addlinkedserver sp_addlinkedserver
คุณต้องตั้งค่าหนึ่งเท่านั้น เมื่อคุณมีแล้วคุณสามารถเรียกตารางบนเซิร์ฟเวอร์อื่น ๆ เช่น:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
โปรดทราบว่าเจ้าของไม่ได้อยู่เสมอdbo
ดังนั้นโปรดแทนที่ด้วยสคีมาที่คุณใช้
[OtherServerName].[OtherDB]..[OtherTable]
อย่างไรก็ตามจะเป็นการดีที่สุดหากรวมไว้
คุณสามารถทำได้โดยใช้เซิร์ฟเวอร์ที่มีการเชื่อมโยง
โดยทั่วไปแล้วเซิร์ฟเวอร์ที่ลิงก์จะได้รับการกำหนดค่าให้เปิดใช้งานโปรแกรมฐานข้อมูลเพื่อเรียกใช้คำสั่ง Transact-SQL ที่รวมตารางไว้ในอินสแตนซ์อื่นของ SQL Server หรือผลิตภัณฑ์ฐานข้อมูลอื่นเช่น Oracle แหล่งข้อมูล OLE DB หลายประเภทสามารถกำหนดค่าเป็นเซิร์ฟเวอร์ที่เชื่อมโยงรวมถึง Microsoft Access และ Excel
เซิร์ฟเวอร์ที่เชื่อมโยงนำเสนอข้อดีดังต่อไปนี้:
อ่านเพิ่มเติมเกี่ยวกับการเชื่อมโยงเซิร์ฟเวอร์
วัตถุเซิร์ฟเวอร์ -> เซิร์ฟเวอร์ที่เชื่อมโยง -> เซิร์ฟเวอร์ที่เชื่อมโยงใหม่
ระบุชื่อเซิร์ฟเวอร์ระยะไกล
เลือกประเภทเซิร์ฟเวอร์ระยะไกล (SQL Server หรืออื่น ๆ )
เลือกความปลอดภัย -> ทำโดยใช้บริบทความปลอดภัยนี้และระบุการเข้าสู่ระบบและรหัสผ่านของเซิร์ฟเวอร์ระยะไกล
คลิกตกลงและคุณทำเสร็จแล้ว !!
นี่คือบทแนะนำอย่างง่ายสำหรับการสร้างเซิร์ฟเวอร์ที่เชื่อมโยง
หรือ
คุณสามารถเพิ่มเซิร์ฟเวอร์ที่เชื่อมโยงโดยใช้แบบสอบถาม
ไวยากรณ์:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
อ่านเพิ่มเติมเกี่ยวกับsp_addlinkedserver
คุณต้องสร้างเซิร์ฟเวอร์ที่เชื่อมโยงเพียงครั้งเดียว หลังจากสร้างเซิร์ฟเวอร์ที่เชื่อมโยงแล้วเราสามารถค้นหาได้ดังนี้:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
นอกจากนี้คุณยังสามารถดูการใช้เซิร์ฟเวอร์ที่เชื่อมโยง เซิร์ฟเวอร์ที่เชื่อมโยงสามารถเป็นแหล่งข้อมูลประเภทอื่นเช่นแพลตฟอร์ม DB2 นี่เป็นวิธีหนึ่งในการพยายามเข้าถึง DB2 จากการเรียก SQL Server TSQL หรือ Sproc ...
Could not find server '88.208.229.164' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
การสืบค้นข้ามฐานข้อมูล 2 แบบคือแบบสอบถามแบบกระจาย นี่คือรายการของเทคนิคบางอย่างรวมทั้งข้อดีและข้อเสีย:
ลองนี้:
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
ทั้งหมดนี้เป็นคำตอบที่ดี แต่อันนี้หายไปและมันมีประโยชน์ใช้สอย อาจเป็นไปได้ว่ามันไม่เหมาะกับสิ่งที่ OP ต้องการ แต่คำถามนั้นคลุมเครือและฉันรู้สึกว่าคนอื่นอาจหาทางมาที่นี่ โดยทั่วไปคุณสามารถใช้ 1 หน้าต่างเพื่อเรียกใช้แบบสอบถามกับเซิร์ฟเวอร์หลาย ๆ ตัวพร้อมกันได้โดยมีวิธีการดังนี้:
ใน SSMS เปิดเซิร์ฟเวอร์ที่ลงทะเบียนและสร้างกลุ่มเซิร์ฟเวอร์ใหม่ภายใต้เซิร์ฟเวอร์กลุ่มภายใน
ภายใต้กลุ่มนี้สร้างการลงทะเบียนเซิร์ฟเวอร์ใหม่สำหรับแต่ละเซิร์ฟเวอร์ที่คุณต้องการสอบถาม หากชื่อ DB แตกต่างกันให้ตั้งค่าเริ่มต้นสำหรับแต่ละชื่อในคุณสมบัติ
ตอนนี้กลับไปที่กลุ่มที่คุณสร้างในขั้นตอนแรกคลิกขวาและเลือกแบบสอบถามใหม่ หน้าต่างแบบสอบถามใหม่จะเปิดขึ้นและแบบสอบถามใด ๆ ที่คุณเรียกใช้จะถูกดำเนินการในแต่ละเซิร์ฟเวอร์ในกลุ่ม ผลลัพธ์จะถูกนำเสนอในชุดข้อมูลเดียวที่มีชื่อคอลัมน์เพิ่มเติมเพื่อระบุว่าเซิร์ฟเวอร์ใดที่ระเบียนนั้นมา ถ้าคุณใช้แถบสถานะที่คุณจะทราบชื่อเซิร์ฟเวอร์จะถูกแทนที่ด้วยหลาย
ฉันมีปัญหาเดียวกันในการเชื่อมต่อ SQL_server 2008 กับ SQL_server 2016 ที่โฮสต์ในเซิร์ฟเวอร์ระยะไกล คำตอบอื่น ๆ ไม่ได้ผลสำหรับฉันตรงไปตรงมา ฉันเขียนโซลูชัน tweaked ของฉันที่นี่เพราะฉันคิดว่ามันอาจเป็นประโยชน์สำหรับคนอื่น
คำตอบเพิ่มเติมสำหรับการเชื่อมต่อระยะไกล IP db:
ขั้นตอนที่ 1: ลิงค์เซิร์ฟเวอร์
EXEC sp_addlinkedserver @server='SRV_NAME',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'aaa.bbb.ccc.ddd';
EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'
... SRV_NAME
ชื่อที่ประดิษฐ์ เราจะใช้มันเพื่ออ้างถึงเซิร์ฟเวอร์ระยะไกลจากแบบสอบถามของเรา aaa.bbb.ccc.ddd
เป็นที่อยู่ IP ของเซิร์ฟเวอร์ระยะไกลที่โฮสต์ SQLserver DB ของคุณ
ขั้นตอนที่ 2: เรียกใช้คิวรีของคุณ ตัวอย่างเช่น:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
... และนั่นมัน!
รายละเอียดไวยากรณ์: sp_addlinkedserverและsp_addlinkedsrvlogin
สร้างคำนิยามเซิร์ฟเวอร์ที่เชื่อมโยงในเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่น (คุณต้องใช้ SA ในการดำเนินการนี้) จากนั้นเพียงอ้างอิงพวกเขาด้วยการตั้งชื่อ 4 ส่วน (ดู BOL)
เซิร์ฟเวอร์ 2008:
เมื่ออยู่ใน SSMS เชื่อมต่อกับ server1.DB1 และลอง:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
ดังที่คนอื่น ๆ ระบุไว้หากไม่ได้ผลนั่นเป็นเพราะเซิร์ฟเวอร์ไม่ได้เชื่อมโยง
ฉันได้รับข้อผิดพลาด:
ไม่พบเซิร์ฟเวอร์ DB2 ใน sys.servers ตรวจสอบว่าระบุชื่อเซิร์ฟเวอร์ที่ถูกต้อง หากจำเป็นให้ดำเนินการกระบวนงานที่เก็บไว้ sp_addlinkedserver เพื่อเพิ่มเซิร์ฟเวอร์ไปยัง sys.servers
ในการเพิ่มเซิร์ฟเวอร์:
อ้างอิง: เพื่อเพิ่มเซิร์ฟเวอร์โดยใช้การเชื่อมโยง sp_addlinkedserver: [1]: การเพิ่มเซิร์ฟเวอร์โดยใช้ sp_addlinkedserver
หากต้องการดูว่ามีอะไรอยู่ใน sys.servers ของคุณเพียงแค่ค้นหา:
SELECT * FROM [sys].[servers]
select *
from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
ในฐานะที่เป็น @ Super9 บอกเกี่ยวกับ OPENDATASOURCE ใช้รับรองความถูกต้องของ SQL Server กับผู้ให้บริการข้อมูล SQLOLEDB ฉันเพิ่งโพสต์ที่นี่ข้อมูลโค้ดสำหรับหนึ่งตารางอยู่ในฐานข้อมูลเซิร์ฟเวอร์ปัจจุบันที่โค้ดทำงานอยู่และอีกอันในเซิร์ฟเวอร์อื่น'192.166.41.123'
SELECT top 2 * from dbo.tblHamdoonSoft tbl1 inner JOIN
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id
sp_addlinkedserver('servername')
มันควรจะเป็นแบบนี้ -
select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันใช้คำพ้องความหมาย สมมติว่ามีการดำเนินการค้นหาภายในเซิร์ฟเวอร์ฐานข้อมูล A และค้นหาตารางในเซิร์ฟเวอร์ฐานข้อมูล B ที่ไม่มีอยู่ในเซิร์ฟเวอร์ A เพิ่มคำพ้องบนฐานข้อมูลที่เรียกตารางจากเซิร์ฟเวอร์ B แบบสอบถามของคุณไม่จำเป็นต้อง รวมสกีมาใด ๆ หรือชื่อฐานข้อมูลที่แตกต่างกันเพียงแค่เรียกชื่อตารางต่อปกติและมันจะทำงาน
ไม่จำเป็นต้องเชื่อมโยงเซิร์ฟเวอร์เนื่องจากคำพ้องความหมายเป็นประเภทของการเชื่อมโยง
วัตถุเซิร์ฟเวอร์ ---> เซิร์ฟเวอร์ที่เชื่อมโยง ---> เซิร์ฟเวอร์ที่เชื่อมโยงใหม่
ในเซิร์ฟเวอร์ที่เชื่อมโยงเขียนชื่อเซิร์ฟเวอร์หรือที่อยู่ IP สำหรับเซิร์ฟเวอร์อื่นและเลือก SQL Server ในการรักษาความปลอดภัยเลือก (ทำโดยใช้บริบทความปลอดภัยนี้) เขียนล็อกอินและรหัสผ่านสำหรับเซิร์ฟเวอร์อื่น
เชื่อมต่อแล้วใช้
Select * from [server name or ip addresses ].databasename.dbo.tblname
โซลูชันที่ง่ายขึ้นสำหรับการเพิ่มเซิร์ฟเวอร์ที่เชื่อมโยง
เซิร์ฟเวอร์ตัวแรก
EXEC sp_addlinkedserver @server='ip,port\instancename'
เข้าสู่ระบบที่สอง
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
ดำเนินการค้นหาจากเชื่อมโยงกับฐานข้อมูลท้องถิ่น
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]