2010-11-03 36 views
61

Trong khi ở Management Studio, tôi đang cố chạy truy vấn/thực hiện kết nối giữa hai máy chủ được liên kết. Đây có phải là một cú pháp chính xác sử dụng máy chủ db liên kết:Truy vấn mẫu máy chủ được liên kết với máy chủ SQL

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

Về cơ bản, bạn chỉ cần mở đầu tên máy chủ db đến db.table?

Trả lời

132

Định dạng có lẽ nên được:

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

Ví dụ: DatabaseServer1.db1.dbo.table1


Cập nhật: Tôi biết đây là một câu hỏi cũ và câu trả lời tôi có chính xác; tuy nhiên, tôi nghĩ rằng bất kỳ ai khác vấp phải điều này nên biết một vài điều.

Cụ thể, khi truy vấn đối với một máy chủ được liên kết trong một tình huống tham gia TOÀN BỘ bảng từ máy chủ liên kết sẽ khả năng được tải lên máy chủ truy vấn được thực hiện từ để làm các hoạt động tham gia. Trong trường hợp của OP, cả hai table1 từ DB1table1 từ DB2 sẽ được chuyển toàn bộ đến máy chủ thực hiện truy vấn, có lẽ có tên là DB3.

Nếu bạn có bảng lớn, có thể dẫn đến hoạt động mất nhiều thời gian để thực thi. Sau khi tất cả nó bây giờ bị hạn chế bởi tốc độ lưu lượng truy cập mạng mà là đơn đặt hàng của cường độ chậm hơn so với bộ nhớ hoặc thậm chí tốc độ truyền đĩa.

Nếu có thể, hãy thực hiện một truy vấn duy nhất đối với máy chủ từ xa mà không cần tham gia vào bảng cục bộ, để lấy dữ liệu bạn cần vào bảng tạm thời. Sau đó truy vấn ra khỏi đó.

Điều đó là không thể, sau đó bạn cần phải xem xét những thứ khác nhau có thể gây ra máy chủ SQL phải tải toàn bộ bảng cục bộ. Ví dụ: sử dụng GETDATE() hoặc thậm chí một số lần tham gia nhất định. Những kẻ giết người thực hiện khác không đưa ra các quyền thích hợp.

Xem http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ để biết thêm thông tin.

+9

nếu databas Tên máy chủ có dấu nối, cần bao quanh dấu ngoặc vuông – bmw0128

+4

@ bmw0128: Tốt hơn, hãy sử dụng dấu ngoặc kép: nó được hỗ trợ bởi hầu hết mọi nền tảng, không giống như dấu ngoặc vuông của Microsoft. –

+1

Bạn cũng cần sử dụng dấu ngoặc vuông hoặc dấu ngoặc kép khi tên máy chủ cơ sở dữ liệu có dấu chấm trong đó. –

8

Bạn cần chỉ định lược đồ/chủ sở hữu (mặc định là dbo) làm một phần của tham chiếu. Ngoài ra, nên sử dụng kiểu kết nối (ANSI-92) mới hơn.

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

Cú pháp nối bên trong là thích hợp hơn với các tham gia ngầm định? – bmw0128

+2

@ bmw0128: Có, vì nhiều lý do.IMHO, điều quan trọng nhất là nó là quá dễ dàng để vô tình viết một sản phẩm chéo tham gia khi bạn có bàn của bạn và tham gia ở hai nơi khác nhau. –

+0

Lưu ý rằng các phần 4 chấm không LÀM VIỆC đối với một số máy chủ được liên kết không phải SQL-Server. Nó có thể gây ra lỗi như ... Một lược đồ hoặc danh mục không hợp lệ đã được chỉ định cho nhà cung cấp "MSDASQL" cho máy chủ được liên kết "MyLinkedServer". – brewmanz

7

Nếu bạn vẫn thấy vấn đề với ...

tên máy chủ gửi kèm trong []

+0

Cẩn thận: Tôi đã thực hiện một bảng tạo từ chọn bằng [], và thay vì được tạo trên Máy chủ được Liên kết, bảng được tạo cục bộ với một tên như 'dbo.databaseserver1.db1.dbo.table1' – biscuit314

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

Đây là cách chính xác để gọi. Đảm bảo xác minh rằng các máy chủ được liên kết trước khi thực hiện truy vấn!

Để kiểm tra các máy chủ liên kết gọi:

EXEC sys.sp_linkedservers 
+0

Điều này KHÔNG LÀM VIỆC cho một số máy chủ không liên kết với SQL Server. Nó làm tăng lỗi như ... Một lược đồ hoặc danh mục không hợp lệ được chỉ định cho nhà cung cấp "MSDASQL" cho máy chủ được liên kết "MyLinkedServer". – brewmanz

1

truy vấn thường trực tiếp không nên được sử dụng trong trường hợp máy chủ liên kết bởi vì nó nặng nề sử dụng cơ sở dữ liệu tạm thời của SQL server.Ở bước đầu tiên, dữ liệu được lấy vào DB tạm thời sau đó việc lọc xảy ra. Có nhiều chủ đề về điều này. Tốt hơn là sử dụng OPENQUERY mở vì nó chuyển SQL đến máy chủ được liên kết nguồn và sau đó nó trả về kết quả đã lọc, ví dụ:

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

Câu trả lời này không bao gồm tên cơ sở dữ liệu –

+2

Tôi đã cung cấp thông tin cơ sở dữ liệu trong khi tạo máy chủ được liên kết. Để biết chi tiết, bạn có thể xem bên dưới liên kết MSDN: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx –

+0

Tôi có thể làm gì nếu máy chủ được liên kết của tôi yêu cầu xác thực và tôi ' m chỉ cố gắng truy vấn từ ứng dụng PHP của tôi bằng PDO? – nekiala

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

Điều này có thể giúp bạn.

+0

Được thăng hạng. Điều này hoạt động khi bạn đang liên kết MySQL với MS SQL. –

+1

Nói cách khác, điều này đang tạo truy vấn chuyển tiếp. Hãy nhớ rằng câu lệnh truy vấn phải được viết trong SQL nguyên gốc cho máy chủ. Cú pháp cho Oracle khác với Teradata khác với SQL Server, vv – AxGryndr

3

Đối với những người gặp rắc rối với những câu trả lời khác, hãy thử OPENQUERY

Ví dụ:

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

Hoạt động cho SQL Server –

0

Đối với những gì nó có giá trị, tôi thấy cú pháp sau đây để làm việc tốt nhất:

CHỌN * FROM [LINKED_SERVER] ... [TABLE]

Tôi không thể nhận được đề xuất của người khác s để làm việc, sử dụng tên cơ sở dữ liệu. Ngoài ra, nguồn dữ liệu này không có lược đồ.

1
select name from drsql01.test.dbo.employee 
  • drslq01 là servernmae serer --linked
  • thử nghiệm là tên cơ sở dữ liệu
  • dbo là schema -default schema
  • nhân viên là bảng tên

Tôi hy vọng nó giúp hiểu, cách thực hiện truy vấn cho máy chủ được liên kết

Các vấn đề liên quan