Что такое «гетерогенный запрос»?

14

Я получил следующее сообщение об ошибке, касающееся SQL-запроса, который я выполняю в программе. SQL Server 2005 T-SQL.

Гетерогенные запросы требуют ANSI_NULLSи ANSI_WARNINGSопции , которые нужно установить для подключения. Это обеспечивает согласованную семантику запроса. Включите эти параметры, а затем повторите запрос. (серьезность 16)

Исправить это легко, установить ANSI_NULLSи ANSI_WARNINGS ON, но я хотел знать, что такое гетерогенный запрос. Поиск в Google выводит десятки результатов, подсказывающих мне установить, ANSI_NULLSи ANSI_WARNINGSничего не объясняющих, что означает этот термин. Запрос:

UPDATE SRV.DB.DBO.TABLE SET Column=
            (SELECT Column 
            FROM SRV1.DB.DBO.TABLE)

Я думаю, что это связано с подключением к нескольким механизмам баз данных в одном запросе, поскольку я никогда не получал эту ошибку в противном случае.
Означает ли «Гетерогенный» запрос двух разных механизмов баз данных в этом контексте?

Бен Брока
источник

Ответы:

8

Означает ли «Гетерогенный» запрос двух разных механизмов баз данных в этом контексте?

В основном да. «Разнородный» запрос выполняется на «разнородном связанном сервере». Все запросы к этому связанному серверу будут неоднородными.

И «гетерогенный» является подмножеством распределенных запросов

  • Распределенные данные хранятся в нескольких экземплярах SQL Server.
  • Гетерогенные данные, хранящиеся в различных реляционных и нереляционных источниках данных, доступ к которым осуществляется с помощью поставщика OLE DB.

Но «разнородный» всплывает время от времени:

Смотрите ссылки на серверы в MSDN

Возможность выдачи распределенных запросов, обновлений, команд и транзакций для разнородных источников данных по всему предприятию.

sp_addlinkedserver

Связанный сервер обеспечивает доступ к распределенным гетерогенным запросам к источникам данных OLE DB.

И пример MSDN запроса Active Directory в разделе «Объединение разнородных данных»

И снова MSDN "Гетерогенная репликация базы данных"

ГБН
источник
6

Насколько мне известно, да.

Проблема, которую я вижу с вашим запросом, состоит в том, что у вас нет возможности узнать, какая строка вернется из вашей связанной таблицы. Это просто фиктивный код или ваш запрос написан таким образом?

mrdenny
источник
Это фиктивный код, есть один столбец, который я выбираю из 40 баз данных и сохраняю в таблицу «отчет о состоянии» только этих значений.
Бен Брока
1
О хорошо Просто хотел убедиться, что вы знаете, что значение, которое помещается в этот столбец на Srv.db.dbo.table, может отличаться в зависимости от того, на какой версии SQL Server вы запускаете код. В частности, от SQL 2005 до SQL 2008, используя опубликованный код, вы получите другое значение.
Мрденни
Теперь вы заинтересовали меня, какова потенциальная проблема, просто я не знаю, какой ряд я получаю? В этом случае таблица содержит только одну строку, поэтому в подзапросе нет WHERE.
Бен Брока
Если в таблице было несколько строк, в SQL 2005 вы получите первую строку. С SQL 2008 новая таблица получит вторую строку. (Я мог бы иметь это задом наперед.)
mrdenny
Мне бы понравилась статья от MS, объясняющая, что такое «гетерогенный запрос» на самом деле, но, похоже, такого не существует, поэтому я отмечаю это правильно.
Бен Брока
1

Гетерогенный просто означает другое. Таким образом, гетерогенный запрос находится в одной базе данных и запрашивает РАЗНУЮ базу данных. Поскольку базы данных разные, возникает возможность того, что настройки будут другими, что может привести к результатам, отличным от запланированных.

Роберт Харрисон
источник