ОБНОВЛЕНИЕ не работает должным образом со связанным сервером

#sql #sql-server

#sql #sql-сервер

Вопрос:

Пожалуйста, смотрите Запрос ниже:

 select thisdate,created from dbusns d
INNER JOIN (SELECT  MAX(created) created,
                    C.reference 
            FROM dbusns
            INNER JOIN [server].CUSTODYDB.DBO.dbcustody C
                ON dbusnS.urns = C.reference
            WHERE dbusns.datasetname = 'CUSTODY'
            GROUP BY C.reference) T on D.urns = T.reference
WHERE D.urns = '1' 
 

Это возвращает: 2008-10-31 00:00:00.000, 2008-11-01 00:00:00.000

Затем я запускаю запрос ниже:

 UPDATE D
SET thisdate = T.created
FROM dbusns D
INNER JOIN (SELECT  MAX(created) created,
                    C.reference 
            FROM dbusns
            INNER JOIN [server].CUSTODYDB.DBO.dbcustody C
                ON dbusnS.urns = C.reference
            WHERE dbusns.datasetname = 'CUSTODY'
            GROUP BY C.reference) T on D.urns = T.reference
WHERE D.urns = '1' 
 

Затем я запускаю приведенный ниже запрос, который возвращает: 2008-10-31 00:00:00.000 (должно быть: 2008-11-01 00:00:00.000)

 select THISDATE from dbusns where datasetname='CUSTODY' AND URNS='1'
 

Created и ThisDate — это datetimes . Если я уменьшу количество записей в dbcustody до 29 598, значение будет обновляться правильно. Я попытался удалить 29 598-ю запись, но это не сработало.

Что происходит? Похоже, что план выполнения неверен, поскольку отправляемый им удаленный запрос:

 SELECT TOP 1 created FROM dbcustody where reference='1' 
 

Почему не отправляется оператор MAX / ORDER ПО созданному desc?

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

1. Оба сервера используют одну и ту же сортировку и являются dbcustody busns таблицами и или один / оба из них являются представлением?

2. @Dommer, они оба являются одним и тем же сервером. Они оба имеют одинаковую сортировку.

3. Если это один и тот же сервер, почему вы используете запрос из четырех частей? Я в замешательстве. Или вы имеете в виду, что они используют одну и ту же версию SQL? Но как насчет сопоставления каждой базы данных? И является ли это представлением, а не таблицей?

4. @Dommer, извините, они находятся на разных серверах. Обе таблицы, одинаковые параметры сортировки.

5. Круто, хорошо, а как насчет того, чтобы попробовать OPENQUERY вместо этого? Я отредактирую свой ответ на примере…

Ответ №1:

РЕДАКТИРОВАТЬ: удалены некоторые ненужные вещи.

Когда это случалось со мной в прошлом, я обычно прибегал к OPENQUERY, который, как правило, решает проблему. Попробуйте это:

 UPDATE D
SET thisdate = T.created
FROM dbusns D
INNER JOIN (SELECT MaxCreated, Reference FROM OPENQUERY(server, 'SELECT MAX(created) MaxCreated, reference
    FROM CUSTODYDB.DBO.dbcustody') as RemoteTable
    INNER JOIN dbusns ON dbusnS.urns = RemoteTable.reference
    WHERE dbusns.datasetname = 'CUSTODY'
    GROUP BY RemoteTable.reference) T ON D.urns = T.reference
WHERE D.urns = '1' 
 

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

1. Спасибо. Я получаю: 2008-10-31 00:00:00.000 2008-11-01 00:00:00.000 когда я выполню ваш запрос выше. Неправильный план выполнения (см. Удаленный запрос в моем OP — последнем операторе SQL).

2. Да, я думаю, что неправильно истолковал исходный вопрос. Мой ответ неверен!

3. Спасибо. У вас есть какие-либо другие идеи?

4. Я бы всегда полностью квалифицировал каждый столбец e, g, d.thisdate а не thisdate , а также изменил имя столбца max (поэтому назовите его maxCreated вместо created , просто чтобы устранить любую двусмысленность. Это может помочь понять, что происходит.

5. OPENQUERY — это решение, т.Е. Обновляется правильная дата (план выполнения также правильный). Знаете ли вы, почему это так? 1.