2009-06-04 6 views
2

У меня есть абсолютно непонятный случай передо мной. У меня есть две среды базы данных, A и B, где B среда была создана из резервной копии A. Я бегу довольно простой запрос:Группа по статье работает в одном окружении, но не в другом

SELECT 
    customers.customerName   (* varchar(100), not null *) 
    ,countries.countryName   (* varchar(100), not null *) 
    ,Balance = Sum(invoices.Amount) (*  money, not null *) 
FROM invoices 
INNER JOIN customers 
    ON customers.customerID = invoices.customerID 
INNER JOIN countries 
    ON countries.countryID = customers.countryID 
GROUP BY 
    customers.customerName 
    ,countries.countryName 
HAVING 
    Sum(invoices.Amount) <> 0 
ORDER BY 
    customers.customerName 

Запрос возвращает список пользователей, которые имеют не- нулевой баланс по их счету. Результаты среды А выглядеть следующим образом:

customerName  countryName  Balance 
------------  -----------  ------- 
A     United States  20.0000 
B     United States  -5.0000 
C     Canada    199.9900 
D     Canada    -0.0100 
E     United States  55.5900 

Результаты по окружающей среде B являются следующие:

customerName  countryName  Balance 
------------  -----------  ------- 
A     United States  10.0000 
A     United States  -5.0000 
A     United States  -1.0000 
A     United States  17.0000 
A     United States  -1.0000 
B     United States  -1.0000 
B     United States  -4.0000 
C     Canada    100.9900 
C     Canada    99.9900 
... 

запрос отлично работает на окружающей среде А, но это выглядит, как если GROUP BY клаузулы быть полностью игнорируется в среде B.

Запрос работает должным образом, когда я комментирую Sum(invoices.Amount) из предложения SELECT и HAVING, поэтому он определенно связан с моим полем invoices.Amount.

Я выполнил резервное копирование A и восстановил его до B, а SqlDelta (инструмент сравнения баз данных) показывает, что базы данных идентичны, поэтому проблема не связана с данными, это проблема конфигурации, но у меня есть не знаю, где искать.

В случае его соответствующей обе среды используют SQL Server 2000 на 2003. Обе среды установлены на двух отдельных серверах, отдельных экземпляров SQL Server, а также отдельных экземпляров Windows Server в Windows Server 2003.

Что может заставить SQL-сервер не группировать поле invoices.Amount?

+0

Это догадка, так что приносим извинения, если я трачу ваше время; вы можете проверить настройки соединения - есть ли ansi_nulls, а другой нет? – u07ch

+0

Действительно ли это весь запрос? Возможно, это часть большого запроса? – RBarryYoung

+0

Какая версия SQL Server & SP? – RBarryYoung

ответ

2

Оказалось, что с запросом не было ошибки, это была проблема с окружающей средой. В среде A был SQL Server 8.0.2039, где среда B имеет SQL Server 8.0.1053. Я обновил среду B с последними пакетами обновлений, и теперь мой запрос работает так, как ожидалось.

Спасибо за ваши предложения всем :), но теперь у меня есть новая проблема: кого убить в Microsoft за эту хлопот.

+0

Зачем убивать их? sql 2000 - кусок хлама, вы должны получить ресурсы на 2005 или 2008 год! – DForck42

+0

Жажда: хотелось бы! В то время как все, что мы разрабатываем на дому, сделано в 2005 году, мы зависим от некоторых сторонних поставщиков, которые привязаны к 2000 году. Не все, что я могу сделать там :) – Juliet

3

Попробуйте этот запрос, чтобы попытаться воспроизвести проблему в более простой форме:

SELECT customerName, Count(*) 
FROM customer 
GROUP BY customerName 
ORDER BY customerName 

Попробуйте этот запрос, чтобы проверить возможность завершающих пробелов в названии заказчика в качестве причины для группы разному.

SELECT customerName, Count(*) 
FROM 
(
SELECT '|' + customerName + '|' as customerName 
FROM customer 
) as sub 
GROUP BY customerName 
ORDER BY customerName 
1

Что произойдет, если вы закомментировать предложения HAVING, но оставить Sum (invoices.Amount) в ЗЕЬЕСТЕ? т. е. можете ли вы проверить, что функция sum() работает?

Кроме того, вы можете проверить сортировку базы данных (или настройку сервера по умолчанию); параметры сортировки могут влиять на некоторые совокупные функции, но, по общему признанию, я не понимаю, почему это изменит результаты sum().

+0

ЭТО РАБОТАЕТ!Таким образом, это определенно условие HAVING вызывает проблему, в противном случае сопоставление по умолчанию между двумя серверами одинаково. Я должен был заметить это раньше, но похоже, что среда A имеет SQL Server 8.0.2039, где среда B имеет SQL Server 8.0.1053. Похоже, я не установил несколько пакетов обновлений - я дам этот снимок и посмотрю, что произойдет. – Juliet

+0

Ha! Хорошая привязка к номерам версий; 8.00.2039 - SP 4, поэтому, по крайней мере, это будет легко применить во второй среде. – Matt