2014-09-05 2 views
0
SELECT top 10 * 
    FRPM Events 
    WHERE (StartDayID between @p0 
      AND BusinessEventCode in @p1), 
     N'@p0 nvarchar(4000),@p1 nvarchar(4000)',@p0=N'20110701 
      and 20140724',@p1=N'HighVoltage,LowVoltage' 

StartDayID представляет собой целое число, BusinessEventCode является nvarchar колонкой.SQL-параметризованные запросы для «между» и оператором «IN» не работают

не нашли какой-либо помощи в Интернете для BETWEEN и IN оператора ..

+0

для "in" части инструкции, вы можете отделить свой список, разделенный запятой, в таблицу/переменную temp, а затем использовать в (выберите что-либо из #tempTable). В течение дат вы можете использовать две переменные startDate и endDate и использовать «между startDate и endDate» – Kritner

+0

Помог ли вам какой-либо ответ на вашу проблему? – Kritner

+0

Это автоматический сгенерированный запрос из nhibernate, у меня нет большого контроля над запросом или параметрами. Я думал, что делаю синтаксическую ошибку, ставя одну цитату здесь и далее. –

ответ

0

Изменение где условие в запросе, как это:

...where (StartDayID between @p0 and @p1) AND BusinessEventCode in (@p2); 

@p0 = 20110701 
@p1 = 20140724 
@p2 = HighVoltage,LowVoltage' 
+1

«IN» часть запроса не работает с @ p2 – Kritner

+0

Это автоматический сгенерированный запрос из nhibernate, у меня нет большого контроля над запросом или параметрами. Я думал, что делаю синтаксическую ошибку, ставя одну цитату здесь и далее. –

0

Как было отмечено в моем комментарии, вы могли бы сделать

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 быть распространенным в тексте, где нечто вроде трубы (|) будет потенциально менее распространено.

0

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

declare @p0 nvarchar(100)=N'20110701 and 20140724'; 
declare @p1 nvarchar(100)=N'''HighVoltage'',''LowVoltage'''; 
declare @SQL nvarchar(Max); 

set @SQL = 'SELECT TOP 10 * '+ 
    'FROM Events '+ 
     'WHERE StartDayID between '+ @p0 + 
     ' AND BusinessEventCode IN(' + @p1 + ')' 

exec sp_executesql @SQL 
+0

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

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