1

У меня есть мнение, что возвращает ProductName, Qty и другие столбцыНет NVARCHAR: "Операнд типа данных NVARCHAR недопустим для оператора суммы"

Определяются как:

SELECT ProductName, Qty, /* etc. */ 
FROM SomeConcreteTable 

SomeConcreteTable не определяет ProductName, как nvarchar(40) и Qty как float.

SELECT ProductName, SUM(Qty) 
FROM MyView 
GROUP BY ProductName 

Это приводит к ошибке

Операнда типа данных NVARCHAR недопустим для суммы оператора

Когда вид не возвращает ни одной строки, нет никакой ошибки, когда WHERE условия По мнению модифицируется так что он возвращает строки.

SELECT ProductName, SUM(COALESCE(vStarts.LotQty, 0)) 
FROM MyView 
GROUP BY ProductName 

Работает независимо от того, возвращает ли представление строки.

В this post Ливен Кирсмайерс говорит, что использование анонимного типа в запросе имело ту же проблему, что и число типов не было выведено.

Имеет смысл.

Однако в моем случае типы не следует выводить - они взяты из таблицы.

Не задавать столь часто оскорбленный вопрос, но является ли это ошибкой?

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

Microsoft SQL Server 2012 (SP1) - 11.0.3482.0 (X64)

ответ

0

Вполне вероятно, что ваше определение вида для MyView слепков или Преобразует Кол-во с поплавком на NVARCHAR. Возможно, вам придется нажать CAST/CONVERT обратно в SUM.

+0

К сожалению, это не так. Я просто создал представление, и это прямой SELECT. Никакое представление не имеет каких-либо изменений или каких-либо других изменений в SELECT, кроме нескольких псевдонимов имен. –

+0

Является ли явное литье Qty обратно в float, чтобы вычислить SUM? –

+0

Когда я явно бросаю плавать, ошибка действительно исчезает.Я ожидаю, что если MSSQL потеряет отслеживание типа данных. Похоже, что данные строки необходимы для получения типа данных и что «VARCHAR» предполагается иначе, даже если тип данных не должен быть выведен. –

4

вы должны отдать свой столбец первой, и она будет работать

SELECT SUM(CAST(Qty as int)) // change to desired type, int for example purposes only 
+0

Не работает ли СУММ() с обнуляемыми поплавками? –

+0

, пожалуйста, проверьте, не является ли его поплавок, – Sherlock

+0

Я уверен, что это поплавок. Вот почему это так странно! –

0

Я решил эту проблему, но не нашли причину. В фазе поиска «попробуйте случайные вещи», я открыл представление в SSMS и изменил строку FROM, чтобы использовать явную нотацию Database.Schema.Table. Отсутствие ошибок даже без предварительного уведомления COALESCE. Я вернулся к неявному синтаксису. До сих пор работает. : shrug: Любые идеи?

+0

Вероятно, метаданные вида необходимо обновить после изменения определения базовых таблиц. –

-1

У меня была такая же проблема, и решение было очень простым:
Sum (+ Кол-во)

Смежные вопросы