Я написал хранимую процедуру, но она не возвращает никаких результатов. Запрос процедуры работает нормально. Но тот же запрос не возвращает никакого результата в процедуре.
Процедура:
ALTER proc [dbo].[GetValuesByDateRange](@dateFrom as datetime2, @dateTo as datetime2, @devId as varchar)
as
select *
from SensorValues
where AddDate between @dateFrom and @dateTo
and JSON_VALUE(Value,'$.DevId') = @devId
Запрос
select *
from SensorValues
where AddDate
between '2020-12-10 00:00:00' and '2020-12-14 00:00:00'
and JSON_VALUE(Value,'$.DevId') = '408414743'
Да, к сожалению, забыл, теперь работает, спасибо :)
Что вы используете неподдерживаемую версию SQL Server?


Попробуйте использовать круглые скобки между двумя отдельными условиями, а также используйте varchar (max) вместо одного varchar
ALTER proc [dbo].[GetValuesByDateRange](@dateFrom as datetime2, @dateTo as datetime2,
@devId as varchar(9))
as
select * from SensorValues
where (AddDate between @dateFrom and @dateTo)
and JSON_VALUE(Value,'$.DevId')= @devId
Какая разница? Скобки ничего не меняют! И лучше выбрать подходящую длину, чем использовать max.
@DaleK- VARCHAR(MAX) Должен ли обряд занимать только требуемую память? Вместо того, чтобы занимать 8000 байт
Добавление ненужных скобок в этом случае сбивает с толку.
Использование VARCHAR(MAX) указывает, что допустима строка любой длины, что крайне маловероятно. Гораздо лучше использовать значимые значения.
varcharвсегда должен иметь длину... иначе этоvarchar(1), которое усекает ваше значение. Вам нужно как минимумvarchar(9)для ваших образцов данных, возможно, дольше.