Я работаю над некоторыми отчетами, которые были созданы до того, как я приступил к своей текущей работе.Один из этих отчетов основан на представлении (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
Весь запрос выглядит довольно отвратительно.В любом случае, любые мысли о том, как это может произойти, будут с благодарностью приняты.Возможно, это связано с профсоюзом?Я не знаю.Помогите!