SQL Server возвращает противоречивые результаты - PullRequest
1 голос
/ 21 марта 2011

Я работаю над некоторыми отчетами, которые были созданы до того, как я приступил к своей текущей работе.Один из этих отчетов основан на представлении (SQL Server 2005).

Это представление невероятно большое и громоздкое, и сейчас я не буду его публиковать, потому что считаю его слишком большим.Я не уверен, как это было сделано - я предполагаю, что это было сделано в дизайнере, потому что я не вижу, чтобы кто-то действительно писал такие вещи.Это несколько страниц, и ссылается на 5 других просмотров.Итог - это сложно, и его нужно реорганизовать / переработать, но пока у нас не останется времени для этого, мы застряли с ним.

В любом случае, я должен внести в него некоторые незначительные нефункциональные изменения, чтобыпереместить его в другую базу данных и схему.Чтобы убедиться, что я не изменяю то, что он на самом деле возвращает, я изменяю вторую версию представления.Давайте назовем первое представление vw_Data1 и мое новое представление vw_Data2.Теперь, если я напишу:

SELECT Count(*) FROM
(
SELECT * FROM vw_Data1
UNION
SELECT * FROM vw_Data2
)

, тогда я должен вернуть тот же номер, как если бы я только что

SELECT Count(*) FROM vw_Data1

, пока vw_Data1 и vw_Data2 возвращают идентичные строки (вот чтоЯ хочу проверить).

Тем не менее, я обнаружил, что если я выполню запрос UNION несколько раз, я получу РАЗНЫЕ РЕЗУЛЬТАТЫ В КАЖДЫЙ РАЗ.

Так что, чтобы было ясно, еслиЯ запускаю:

SELECT Count(*) FROM
(
SELECT * FROM vw_Data1
UNION
SELECT * FROM vw_Data2
)

несколько раз, затем каждый раз получаю разные результаты.

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

Используется одна недетерминированная функция, которая является частью следующего (ужасного) соединения:

LEFT OUTER JOIN dbo.vwuniversalreportingdata_budget 
     ON 



CASE
    WHEN dbo.f_tasks.ta_category = 'Reactive' THEN
        CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10)) 
            + ' | ' 
                + CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10)) 
                    + ' | ' 
                        + CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_sched_date)) AS VARCHAR(10))
    WHEN dbo.f_tasks.ta_category = 'Planned' THEN
        CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10)) 
            + ' | ' 
                + CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10)) 
                    + ' | ' 
                        + CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_est_date)) AS VARCHAR(10))
    WHEN dbo.f_tasks.ta_category = 'Periodic' THEN
        CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10)) 
            + ' | ' 
                + CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10)) 
                    + ' | ' 
                        + CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_est_date)) AS VARCHAR(10))
END
= dbo.vwuniversalreportingdata_budget.id 

Весь запрос выглядит довольно отвратительно.В любом случае, любые мысли о том, как это может произойти, будут с благодарностью приняты.Возможно, это связано с профсоюзом?Я не знаю.Помогите!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...