вторник, 23 декабря 2014 г.

Борьба с очень длинными путями в SQL запросах

Вчера ко мне обратился коллега с проблемой, при выборке данных в View с другого сервера возникает ошибка "The object name 'AW1.SAR.ICM.DialerDB.dbo.ViewDialerReport1' contains more than the maximum number of prefixes. The maximum is 3." Что это за проблема и как с ней бороться под катом.

Есть два SQL сервера, на одном есть View, а на другом нужно создать View которая будет забирать данные из View с первого сервера. Зачем так, не спрашивайте, особенности мироустройства такие.
На втором сервере первый подключается через Linked Server:
Запрос со второго сервера вида:
select * from AW1.SAR.ICM.DialerDB.dbo.ViewDialerReport1
Приводит к ошибке указанной в начале этой статьи:
В запросе можно ее решить просто, достаточно имя сервера взять в квадратные скобки:
select * from [AW1.SAR.ICM].DialerDB.dbo.ViewDialerReport1
Все работает:
Но это не самое интересное, если попробовать создать View по этому запросу, то выдается очень похожая ошибка:
 
Сначала я нашел сложный вариант, через создание функции:
CREATE FUNCTION dbo.func_ViewDialerReport1()
RETURNS TABLE
AS
RETURN (
    select * from [AW1.SAR.ICM].DialerDB.dbo.ViewDialerReport1
);
 
А потом, на ее основе уже View:
CREATE VIEW dbo.view_ViewDialerReport1 AS
SELECT * FROM func_ViewDialerReport1()
Но, уже когда писал эту статью, меня осенило, а зачем делать функцию, если при генерации SQL скриптом квадратные скобки не чистятся и можно сразу писать вот так:
CREATE VIEW dbo.view_ViewDialerReport1 AS
select * from [AW1.SAR.ICM].DialerDB.dbo.ViewDialerReport1
Оба способа (и через функцию и сразу генерить View) работают. Так что, SQL команды работают правильно, а вот дизайнер тупит в таких случаях.


Комментариев нет:

Отправить комментарий