Приклад запиту на зв’язаний сервер SQL Server


93

Перебуваючи в Management Studio, я намагаюся запустити запит / зробити об’єднання між двома пов’язаними серверами. Це правильний синтаксис із використанням пов'язаних серверів баз даних:

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

По суті, ви просто вводите ім'я сервера db до db.table?

Відповіді:


186

Формат, мабуть, повинен бути таким:

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

Наприклад: DatabaseServer1.db1.dbo.table1


Оновлення : я знаю, що це старе запитання, і я маю правильну відповідь; однак, я думаю, хтось, хто натрапляє на це, повинен знати кілька речей.

А саме, під час запиту щодо зв’язаного сервера у ситуації об’єднання, ВСЯ таблиця із пов’язаного сервера, швидше за все, буде завантажена на сервер, з якого виконується запит, щоб виконати операцію об’єднання. У випадку з операційною системою, як table1з , так DB1і table1з неї DB2будуть передані повністю на сервер, що виконує запит, імовірно названий DB3.

Якщо у вас великі таблиці, це може призвести до операції, яка виконується довго. Врешті-решт, це зараз обмежено швидкістю мережевого трафіку, яка на порядок менша, ніж швидкість передачі пам'яті або навіть диска.

Якщо можливо, виконайте один запит щодо віддаленого сервера, не приєднуючись до локальної таблиці, щоб витягти потрібні дані до тимчасової таблиці. Тоді запитуйте це.

Якщо це неможливо, вам потрібно розглянути різні речі, які змусили б SQL-сервер завантажувати всю таблицю локально. Наприклад використання GETDATE()або навіть певні об'єднання. Інші вбивці продуктивності включають не надання відповідних прав.

Для отримання додаткової інформації див. Http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ .


11
якщо ім'я
сервера

4
@ bmw0128: Ще краще, використовуйте подвійні лапки: це підтримується майже на всіх платформах, на відміну від квадратних дужок Microsoft.

2
Вам також потрібно використовувати квадратні дужки або подвійні лапки, коли в назві сервера бази даних є крапка.
Девід Брунов

4
Якщо ви не впевнені щодо будь-якого з кваліфікаторів, перейдіть до таблиці на зв’язаному сервері в Провіднику об’єктів SSMS, клацніть правою кнопкою миші та Таблиця сценаріїв як, ВИБРАТИ до та Вікно нового редактора запитів. Отриманий оператор SELECT міститиме правильний, повністю кваліфікований шлях до таблиці. У мене був кваліфікатор бази даних таємниць у роботі з Sybase, і це дало мені правильне ім'я.
Джон Мо

Я думаю, ви невірно сказали, що буде перенесена вся таблиця. Чи можете ви дати посилання на те, звідки ви взяли цю інформацію? Я щойно спробував приєднатися до таблиці з 204 мільйонами рядків (16 ГБ даних, 6,6 ГБ індексу) на зв’язаному сервері, і знадобилося 47 мс, щоб зв’язати 5 рядків, 7 мс на другий запит, оскільки дані, імовірно, були кешовані. Можливо, якщо ваше приєднання вимагало сканування таблиці у зв’язаній таблиці, йому довелося б все це перенести?
Джейсон Гоемаат

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

Це може вам допомогти.


Проголосував. Це працює, коли ви пов'язуєте MySQL з MS SQL.
Баз Гувенкая

3
Іншими словами, це створення прохідного запиту. Майте на увазі, що оператор запиту повинен бути записаний у власному SQL для сервера. Синтаксис для Oracle відрізняється від Teradata, ніж SQL Server тощо
AxGryndr

10

Якщо ви все ще знайдете проблему з <server>.<database>.<schema>.<table>

Додайте ім'я сервера до []


Обережно: Я виконав таблицю створення з select за допомогою [], і замість того, щоб створювати її на зв'язаному сервері, таблицю створювали локально з назвою типуdbo.databaseserver1.db1.dbo.table1
biscuit314


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: Так, з кількох причин. ІМХО, найважливішим є те, що надто легко випадково написати перехресне приєднання продукту, коли ваші таблиці та об’єднання є у двох різних місцях.

Зверніть увагу, що 4-крапкові частини НЕ ПРАЦЮЮТЬ на деяких серверах, не пов’язаних із SQL-сервером. Це може спричинити помилку, наприклад ... Для постачальника "MSDASQL" для пов'язаного сервера "MyLinkedServer" була вказана недійсна схема або каталог.
brewmanz

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

Це правильний спосіб дзвінка. Обов’язково переконайтеся, що сервери пов’язані, перш ніж виконувати запит!

Щоб перевірити наявність зв’язаних серверів, зателефонуйте:

EXEC sys.sp_linkedservers 

Це НЕ ПРАЦЮЄ для деяких серверів, не пов'язаних із SQL-сервером. Це спричиняє помилку, наприклад ... Для постачальника "MSDASQL" для пов'язаного сервера "MyLinkedServer" була вказана недійсна схема або каталог.
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01 - servernmae - зв’язаний сервер
  • test - це назва бази даних
  • dbo - це схема -за замовчуванням
  • працівник - це ім'я таблиці

Я сподіваюся, це допоможе зрозуміти, як виконувати запит для пов'язаного сервера


2

Зазвичай прямі запити не слід використовувати у випадку пов'язаного сервера, оскільки він активно використовує тимчасову базу даних сервера SQL. Спочатку дані отримуються в тимчасову БД, після чого відбувається фільтрація. Про це є багато ниток. Краще використовувати відкритий OPENQUERY, оскільки він передає SQL вихідному пов'язаному серверу, а потім повертає відфільтровані результати, наприклад

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

Ця відповідь не включає ім’я бази даних
Кріс Невілл

2
Я створював інформацію про базу даних під час створення зв’язаного сервера. Детальніше ви можете побачити нижче за посиланням MSDN: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Мухаммад

Що я можу зробити, якщо мій зв’язаний сервер вимагає автентифікації, і я просто намагаюся робити запити з моєї програми PHP за допомогою PDO?
nekiala

Як би ви виконали приєднання з бази даних 1 до бази даних на пов'язаному сервері, використовуючи цей підхід?
eaglei22

2

Для того, що це варто, я знайшов такий синтаксис, який найкраще працює:

ВИБЕРІТЬ * З [LINKED_SERVER] ... [ТАБЛИЦЯ]

Я не міг отримати рекомендації інших для роботи, використовуючи ім’я бази даних. Крім того, це джерело даних не має схеми.


2

клацніть правою кнопкою миші на таблиці та клацніть таблицю скриптів як виберіть

введіть тут опис зображення


Це не те, що запитував ОП
Fandango68,

2
це показує, як отримати правильний синтаксис для запиту вибору у зв’язаній таблиці. результат схожий на відповідь моряків
Шимон Дудкін

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"')

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.