Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подсчет строк в динамическом запросе  [new]
hmwrld
Member

Откуда:
Сообщений: 4
Есть табличка, в которой нужно подсчитать количество строк по условию.
Обычным запросом это было бы так:

SELECT COUNT(Ni) From Result Where Ni between @min and @max


тоже самое нужно сделать в динамическом запросе, с коим выходит косяк.
Сам запрос такой:
SET @s = 'SET @cn = (SELECT Count(' + COL_NAME(OBJECT_ID('Result'), @sch) + ') 
          FROM Result 
          WHERE Id_s = ' + @id_s  + ' and ' + COL_NAME(OBJECT_ID('Result'), @sch) + ' between ' + @min + ' and' + @max + ')'
execute sp_executesql @s, N'@cn int output', @cn out

@sch - номер столбца, роли не играет :)
Ошибка: "Ошибка арифметического переполнения при преобразовании nvarchar к типу данных numeric."

А если обрезать запрос до такого вида, то все работает, но уже, естественно, без условия
SET @s = 'SET @cn = (SELECT Count(' + COL_NAME(OBJECT_ID('Result'), @sch) + ') 
          FROM Result 
          WHERE Id_s = ' + @id_s
execute sp_executesql @s, N'@cn int output', @cn out


Понимаю, что косяк во втором Col_Name, но почему в селекте нормально конструкция прошла, а в where нет?
13 сен 15, 17:36    [18144130]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37051
SET @s = 'SET @cn = (SELECT Count(' + COL_NAME(OBJECT_ID('Result'), @sch) + ') 
          FROM Result 
          WHERE Id_s = ' + @id_s  + ' and ' + COL_NAME(OBJECT_ID('Result'), @sch) + ' between ' + @min + ' and' + @max + ')'
execute sp_executesql @s, N'@cn int output', @cn out
13 сен 15, 17:39    [18144138]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Не понимаю, почему не годится COUNT(*)?
Или действительно не надо считать строки со значением NULL в колонке?
13 сен 15, 17:46    [18144162]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
Не понимаю, почему не годится COUNT(*)?
Или действительно не надо считать строки со значением NULL в колонке?
Значение NULL всё равно же отсеивается условием в WHERE
13 сен 15, 17:47    [18144166]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
hmwrld
Member

Откуда:
Сообщений: 4
Гавриленко Сергей Алексеевич
SET @s = 'SET @cn = (SELECT Count(' + COL_NAME(OBJECT_ID('Result'), @sch) + ') 
          FROM Result 
          WHERE Id_s = ' + @id_s  + ' and ' + COL_NAME(OBJECT_ID('Result'), @sch) + ' between ' + @min + ' and' + @max + ')'
execute sp_executesql @s, N'@cn int output', @cn out


Аа, дошло, пытаюсь сравнить имя столбца с нумериком


Тогда другой вопрос: Как вытащить значение столбца, зная его имя в таком формате "COL_NAME(OBJECT_ID('Result'), @sch)"?


Не использую Cost(*) просто для проверки работы конструкции Col_name. Если с where разберусь, то перейду на cost(*)
13 сен 15, 17:58    [18144206]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
hmwrld
Member

Откуда:
Сообщений: 4
hmwrld
Гавриленко Сергей Алексеевич
SET @s = 'SET @cn = (SELECT Count(' + COL_NAME(OBJECT_ID('Result'), @sch) + ') 
          FROM Result 
          WHERE Id_s = ' + @id_s  + ' and ' + COL_NAME(OBJECT_ID('Result'), @sch) + ' between ' + @min + ' and' + @max + ')'
execute sp_executesql @s, N'@cn int output', @cn out


Аа, дошло, пытаюсь сравнить имя столбца с нумериком


Тогда другой вопрос: Как вытащить значение столбца, зная его имя в таком формате "COL_NAME(OBJECT_ID('Result'), @sch)"?


Не использую Cost(*) просто для проверки работы конструкции Col_name. Если с where разберусь, то перейду на cost(*)


Вру, не использую Cost(*), т к несколько столбцов, и в некоторых возможно значение NULL
Например, Cost(Ni) = 3, Cost(Cu) = 0 и пр (Ni, Cu столбцы в одной таблице)
13 сен 15, 18:11    [18144253]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
hmwrld
Вру, не использую Cost(*), т к несколько столбцов, и в некоторых возможно значение NULL
Например, Cost(Ni) = 3, Cost(Cu) = 0 и пр (Ni, Cu столбцы в одной таблице)
Во-первых, не Cost, а COUNT?
Во-вторых, не понял смысла слов про разные колонки - я ж вроде сказал Вам,
что NULLы и так не попадают в результат вашего запроса.
А SELECT, в котором вызывается COUNT, логически выполняется после WHERE
13 сен 15, 18:43    [18144333]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет строк в динамическом запросе  [new]
hmwrld
Member

Откуда:
Сообщений: 4
iap
hmwrld
Вру, не использую Cost(*), т к несколько столбцов, и в некоторых возможно значение NULL
Например, Cost(Ni) = 3, Cost(Cu) = 0 и пр (Ni, Cu столбцы в одной таблице)
Во-первых, не Cost, а COUNT?
Во-вторых, не понял смысла слов про разные колонки - я ж вроде сказал Вам,
что NULLы и так не попадают в результат вашего запроса.
А SELECT, в котором вызывается COUNT, логически выполняется после WHERE


Да, конечно Count(*)
До меня наконец дошло

Теперь все работает, всем спасибо :)

SET @s = 'SET @cn = (SELECT Count(*) 
          FROM Result 
          WHERE Id_s = ' + @id_s  + ' and ' + COL_NAME(OBJECT_ID('Result'), @sch) + '>= ' + CAST(@min as varchar) + 
          ' and ' + COL_NAME(OBJECT_ID('Result'), @sch) + ' < ' + CAST(@max as varchar) +')'
execute sp_executesql @s, N'@cn int output', @cn out 
14 сен 15, 07:37    [18145136]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить