Как было отмечено в моем комментарии, вы могли бы сделать
WHERE (StartDayID between @p0
часть вашего запроса, разделив из @ p0 в две переменные, как, например:
declare @startDate datetime
declare @endDate datetime
select @startdate = 20110701, @endDate = 20140724
....
WHERE (StartDayID between @startDate and @endDate)
В части вашего запроса немного сложнее, и вам может понадобиться разбить отдельные значения на таблицу temp/variable, чтобы обрабатывать их в инструкции IN.
Вы можете сделать это с помощью функции разделенного типа (взято из http://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql/):
CREATE FUNCTION [dbo].[Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
GO
Затем в запросе, где у вас есть:
....
AND BusinessEventCode in @p1),
это стало бы:
@p1=N'HighVoltage,LowVoltage'
....
AND BusinessEventCode in (SELECT Data FROM dbo.Split(@p1, ','))),
Обратите внимание, что если вы идете по этому маршруту, вам может потребоваться переосмыслить ваш разделитель как «,» c быть распространенным в тексте, где нечто вроде трубы (|) будет потенциально менее распространено.
для "in" части инструкции, вы можете отделить свой список, разделенный запятой, в таблицу/переменную temp, а затем использовать в (выберите что-либо из #tempTable). В течение дат вы можете использовать две переменные startDate и endDate и использовать «между startDate и endDate» – Kritner
Помог ли вам какой-либо ответ на вашу проблему? – Kritner
Это автоматический сгенерированный запрос из nhibernate, у меня нет большого контроля над запросом или параметрами. Я думал, что делаю синтаксическую ошибку, ставя одну цитату здесь и далее. –