แบบสอบถามตัวอย่างเซิร์ฟเวอร์ที่เชื่อมโยงเซิร์ฟเวอร์ SQL


94

ขณะอยู่ใน Management Studio ฉันพยายามเรียกใช้แบบสอบถาม / ทำการเข้าร่วมระหว่างเซิร์ฟเวอร์ที่เชื่อมโยงสองเซิร์ฟเวอร์ นี่คือไวยากรณ์ที่ถูกต้องโดยใช้เซิร์ฟเวอร์ db ที่เชื่อมโยง:

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

โดยทั่วไปคุณเพียงแค่นำชื่อเซิร์ฟเวอร์ db ไปที่ db.table หรือไม่?

คำตอบ:


188

รูปแบบควรจะเป็น:

<server>.<database>.<schema>.<table>

ตัวอย่างเช่น DatabaseServer1.db1.dbo.table1


อัปเดต : ฉันรู้ว่านี่เป็นคำถามเก่าและคำตอบที่ฉันมีนั้นถูกต้อง อย่างไรก็ตามฉันคิดว่าใครก็ตามที่สะดุดกับสิ่งนี้ควรรู้บางสิ่ง

กล่าวคือเมื่อสอบถามกับเซิร์ฟเวอร์ที่เชื่อมโยงในการเข้าร่วมสถานการณ์ทั้งหมดตารางจากเซิร์ฟเวอร์ที่เชื่อมโยงจะมีแนวโน้มที่จะดาวน์โหลดไปยังเซิร์ฟเวอร์แบบสอบถามจะดำเนินการจากเพื่อที่จะทำการดำเนินการเข้าร่วม ในกรณีของ OP ทั้งtable1จากDB1และtable1จากจะถูกโอนในทั้งหมดของพวกเขาไปยังเซิร์ฟเวอร์รันแบบสอบถามสันนิษฐานว่าชื่อ DB2DB3

หากคุณมีตารางขนาดใหญ่อาจส่งผลให้การดำเนินการใช้เวลานานในการดำเนินการ ท้ายที่สุดตอนนี้ถูก จำกัด ด้วยความเร็วการรับส่งข้อมูลเครือข่ายซึ่งเป็นคำสั่งของขนาดที่ช้ากว่าหน่วยความจำหรือแม้แต่ความเร็วในการถ่ายโอนดิสก์

ถ้าเป็นไปได้ให้ดำเนินการสืบค้นเดียวกับเซิร์ฟเวอร์ระยะไกลโดยไม่ต้องเข้าร่วมกับตารางภายในเพื่อดึงข้อมูลที่คุณต้องการลงในตารางชั่วคราว จากนั้นค้นหาสิ่งนั้น

หากเป็นไปไม่ได้คุณต้องดูสิ่งต่างๆที่ทำให้เซิร์ฟเวอร์ SQL ต้องโหลดตารางทั้งหมดในเครื่อง ตัวอย่างเช่นการใช้GETDATE()หรือแม้กระทั่งการรวมบางอย่าง นักฆ่าคนอื่น ๆ รวมถึงการไม่ให้สิทธิ์ที่เหมาะสม

โปรดดูhttp://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/สำหรับข้อมูลเพิ่มเติม


11
ถ้าชื่อ
เซิร์ฟเวอร์

4
@ bmw0128: ยังดีกว่าใช้เครื่องหมายคำพูดคู่ซึ่งรองรับเกือบทุกแพลตฟอร์มซึ่งแตกต่างจากวงเล็บเหลี่ยมของ Microsoft

2
คุณต้องใช้วงเล็บเหลี่ยมหรือเครื่องหมายคำพูดคู่เมื่อชื่อเซิร์ฟเวอร์ฐานข้อมูลมีจุดอยู่
David Brunow

4
หากคุณไม่แน่ใจเกี่ยวกับคุณสมบัติใด ๆ ให้เจาะลึกลงไปที่ตารางในเซิร์ฟเวอร์ที่เชื่อมโยงใน SSMS Object Explorer คลิกขวาและตารางสคริปต์เป็นเลือกถึงและหน้าต่างตัวแก้ไขแบบสอบถามใหม่ คำสั่ง SELECT ที่เป็นผลลัพธ์จะรวมพา ธ ที่ถูกต้องและมีคุณสมบัติครบถ้วนไปยังตาราง ฉันมีคุณสมบัติฐานข้อมูลลึกลับในการทำงานกับ Sybase และทำให้ฉันมีชื่อที่ถูกต้อง
John Mo

ฉันคิดว่าคุณไม่ถูกต้องที่บอกว่าจะโอนตารางทั้งหมด คุณสามารถให้ข้อมูลอ้างอิงว่าคุณได้รับข้อมูลดังกล่าวมาจากที่ใด ฉันเพิ่งลองเข้าร่วมกับตารางที่มี 204 ล้านแถว (ข้อมูล 16GB, ดัชนี 6.6GB) บนเซิร์ฟเวอร์ที่เชื่อมโยงและใช้เวลา 47ms ในการเชื่อมโยงไปยัง 5 แถว, 7ms ในแบบสอบถามที่สองเนื่องจากข้อมูลถูกแคชไว้ บางทีถ้าการเข้าร่วมของคุณต้องการการสแกนตารางบนตารางที่เชื่อมโยงมันจะต้องโอนทั้งหมด?
Jason Goemaat

32
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

สิ่งนี้อาจช่วยคุณได้


โหวตแล้ว ใช้งานได้เมื่อคุณเชื่อมโยง MySQL กับ MS SQL
Baz Guvenkaya

3
กล่าวอีกนัยหนึ่งก็คือการสร้างแบบสอบถามแบบพาส - ทรู โปรดทราบว่าคำสั่งเคียวรีจะต้องเขียนใน SQL ดั้งเดิมสำหรับเซิร์ฟเวอร์ ไวยากรณ์สำหรับ Oracle แตกต่างจาก Teradata แตกต่างจาก SQL Server เป็นต้น
AxGryndr

11

หากคุณยังคงพบปัญหาเกี่ยวกับ <server>.<database>.<schema>.<table>

ใส่ชื่อเซิร์ฟเวอร์ใน []


ข้อควรระวัง: ฉันดำเนินการสร้างตารางจากการเลือกโดยใช้ [] และแทนที่จะสร้างบนเซิร์ฟเวอร์ที่เชื่อมโยงตารางถูกสร้างขึ้นในเครื่องด้วยชื่อเช่นdbo.databaseserver1.db1.dbo.table1
biscuit314

9

สำหรับผู้ที่มีปัญหากับคำตอบอื่น ๆ เหล่านี้ให้ลองOPENQUERY

ตัวอย่าง:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 

ใช้ได้กับ SQL Server
Tom Stickel

8

คุณต้องระบุสคีมา / เจ้าของ (dbo โดยค่าเริ่มต้น) เป็นส่วนหนึ่งของข้อมูลอ้างอิง นอกจากนี้ควรใช้รูปแบบการเข้าร่วม (ANSI-92) ที่ใหม่กว่า

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name

ไวยากรณ์การรวมภายในเป็นที่นิยมในการรวมโดยนัย?
bmw0128

2
@ bmw0128: ใช่ด้วยเหตุผลหลายประการ IMHO ที่สำคัญที่สุดคือเป็นวิธีที่ง่ายเกินไปที่จะเขียนการเข้าร่วมข้ามผลิตภัณฑ์โดยไม่ได้ตั้งใจเมื่อคุณมีโต๊ะและเข้าร่วมในสถานที่สองแห่ง

โปรดสังเกตว่าส่วนที่เป็นจุด 4 จุดไม่ทำงานสำหรับเซิร์ฟเวอร์ที่เชื่อมโยงกับเซิร์ฟเวอร์ SQL ที่ไม่ใช่ SQL บางตัว อาจทำให้เกิดข้อผิดพลาดเช่น ... มีการระบุสคีมาหรือแค็ตตาล็อกที่ไม่ถูกต้องสำหรับผู้ให้บริการ "MSDASQL" สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง "MyLinkedServer"
brewmanz

6
select * from [Server].[database].[schema].[tablename] 

นี่คือวิธีโทรที่ถูกต้อง อย่าลืมตรวจสอบว่าเซิร์ฟเวอร์เชื่อมโยงก่อนดำเนินการค้นหา!

ในการตรวจสอบเซิร์ฟเวอร์ที่เชื่อมโยงโทร:

EXEC sys.sp_linkedservers 

สิ่งนี้ใช้ไม่ได้กับเซิร์ฟเวอร์ที่เชื่อมโยงกับเซิร์ฟเวอร์ SQL ที่ไม่ใช่ SQL ทำให้เกิดข้อผิดพลาดเช่น ... มีการระบุสคีมาหรือแค็ตตาล็อกที่ไม่ถูกต้องสำหรับผู้ให้บริการ "MSDASQL" สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง "MyLinkedServer"
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01 คือ servernmae - linked serer
  • การทดสอบคือชื่อฐานข้อมูล
  • dbo คือ schema -default schema
  • พนักงานคือชื่อโต๊ะ

ฉันหวังว่าจะช่วยให้เข้าใจวิธีดำเนินการค้นหาสำหรับเซิร์ฟเวอร์ที่เชื่อมโยง


2

โดยปกติแล้วไม่ควรใช้แบบสอบถามโดยตรงในกรณีของเซิร์ฟเวอร์ที่เชื่อมโยงเนื่องจากใช้ฐานข้อมูลชั่วคราวของเซิร์ฟเวอร์ SQL เป็นจำนวนมาก ในขั้นตอนแรกข้อมูลจะถูกดึงไปยัง temp DB จากนั้นการกรองจะเกิดขึ้น มีหลายกระทู้เกี่ยวกับเรื่องนี้ จะดีกว่าถ้าใช้ OPENQUERY แบบเปิดเนื่องจากส่งผ่าน SQL ไปยังเซิร์ฟเวอร์ที่เชื่อมโยงต้นทางแล้วส่งคืนผลลัพธ์ที่กรองเช่น

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')

คำตอบนี้ไม่มีชื่อฐานข้อมูล
Chris Nevill

2
ฉันได้ให้ข้อมูลฐานข้อมูลขณะสร้างเซิร์ฟเวอร์ที่เชื่อมโยง สำหรับรายละเอียดคุณสามารถดูลิงค์ MSDN ด้านล่าง: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen

ฉันจะทำอย่างไรหากเซิร์ฟเวอร์ที่เชื่อมโยงของฉันต้องการการรับรองความถูกต้องและฉันแค่พยายามสืบค้นจากแอปพลิเคชัน PHP โดยใช้ PDO
nekiala

คุณจะทำการเข้าร่วมจากฐานข้อมูล 1 ไปยังฐานข้อมูลบนเซิร์ฟเวอร์ที่เชื่อมโยงโดยใช้แนวทางนี้อย่างไร
eaglei22

2

สำหรับสิ่งที่คุ้มค่าฉันพบว่าไวยากรณ์ต่อไปนี้ทำงานได้ดีที่สุด:

SELECT * FROM [LINKED_SERVER] ... [ตาราง]

ฉันไม่สามารถรับคำแนะนำจากผู้อื่นให้ใช้งานได้โดยใช้ชื่อฐานข้อมูล นอกจากนี้แหล่งข้อมูลนี้ไม่มีสคีมา


2

คลิกขวาที่ตารางแล้วคลิกตารางสคริปต์ตามที่เลือก

ป้อนคำอธิบายภาพที่นี่


นั่นไม่ใช่สิ่งที่ OP ถาม
Fandango68

2
นี่แสดงวิธีรับไวยากรณ์ที่ถูกต้องสำหรับเลือกคิวรีบนตารางที่เชื่อมโยง ผลลัพธ์เป็นเหมือนคำตอบของ seans
Shimon Doodkin

1
@ShimonDoodkin ตัวอย่างที่ยอดเยี่ยมของอย่าให้ปลาฉัน แต่สอนวิธีตกปลา
Amro

0

คำค้นหาต่อไปนี้ทำงานได้ดีที่สุด

ลองใช้แบบสอบถามนี้:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

ช่วยในการเชื่อมโยง MySQL กับ MS SQL ได้มาก


0

PostgreSQL :

  1. คุณต้องระบุชื่อฐานข้อมูลในแหล่งข้อมูลDSN
  2. เรียกใช้ Management Studio ในฐานะผู้ดูแลระบบ
  3. คุณต้องละ DBName จากแบบสอบถาม :

    SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')


0

ฉันได้ค้นหาประเภทข้อมูลในตารางที่ link_server โดยใช้ openquery และผลลัพธ์ก็สำเร็จ

SELECT * FROM OPENQUERY (LINKSERVERNAME, '
SELECT DATA_TYPE, COLUMN_NAME
FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME  =''TABLENAME''
')

มันทำงานสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.