2015-01-23 3 views
0

Я создаю этот динамический sql, но получаю сообщение об ошибке при его выполнении.В sql sever, построение динамического sql с целыми переменными

Conversion failed when converting the varchar value 'SELECT 
        DDoSAttacksId, 
        AttackId, 
        TargetIP, 
        PeakBPS, 
        DateStarted                 
      FROM (
       SELECT 
        ROW_NUMBER() OVER (ORDER BY DateStarted Desc) AS Row, 
        DDoSAttacksId         AS DDoSAttacksId, 
        AttackId          AS AttackId, 
        TargetIP          As TargetIP, 
        CONCAT(PeakBPS/1000000000,' Gbps')  As PeakBPS, 
        DateStarted         AS DateStarted 
       FROM 
        DDosAttacks 
       WHERE TargetIP IN ('108.61.51.101', '206.221.181.5')) AS DDosAttacksRows 
      WHERE 
       (Row between (' to data type int. 

Примечание: оно подключается к IP-адресу только в порядке, но не в целых значениях.

set quoted_identifier off 

declare @sql    nvarchar(4000), 
     @PageNumber  int, 
     @PageSize   int, 
     @IPAddressList varchar(100) 

Select @IPAddressList = "'108.61.51.101', '206.221.181.5'" 

select @sql= 'SELECT 
       DDoSAttacksId, 
       AttackId, 
       TargetIP, 
       PeakBPS, 
       DateStarted                 
     FROM (
      SELECT 
       ROW_NUMBER() OVER (ORDER BY DateStarted Desc) AS Row, 
       DDoSAttacksId         AS DDoSAttacksId, 
       AttackId          AS AttackId, 
       TargetIP          As TargetIP, 
       CONCAT(PeakBPS/1000000000,'' Gbps'')  As PeakBPS, 
       DateStarted         AS DateStarted 
      FROM 
       DDosAttacks 
      WHERE TargetIP IN ('[email protected]+')) AS DDosAttacksRows 
     WHERE 
      (Row between ('[email protected]+' * ('[email protected]+' - '[email protected]+')) AND ('[email protected]+' * ('[email protected]+' - 1)))'; 

EXECUTE sp_executesql @sql 

Я могу точные цифры кода на их месте он и выполняет отлично .... например (строка между (1 * (20 - 20)) и (1 * (20 - 1)));

+0

Возможно, вы пытаетесь построить строку 'NVARCHAR', объединив тип' int' (т. Е. '@ PageNumber' в строке' (строка между ('+ @PageNumber + строка), которая является недопустимой. –

+0

Возможный дубликат из [Как объединить числа и строки для форматирования чисел в T-SQL?] (http://stackoverflow.com/questions/951320/how-to-concatenate-numbers-and-strings-to-format-numbers-in- t-sql) – LittleBobbyTables

ответ

3

вы можете попробовать что-то вроде:

'(Row between ('+ cast(@PageNumber as varchar(255)) +' * ('+cast(@PageSizeas varchar(255)) +' - '+cast(@PageSize as varchar(255))+')) AND ('+cast(@PageNumber as varchar(255))+' * ('+cast(@PageSize as varchar(255))+' - 1)))'; 

Обновленный мой ответ при условии, длине отлиты VARCHAR в связи с КМ ответ ниже. спасибо KM за объяснение.

+1

Спасибо, что это сработало .. всем, кто ответил аналогично ... спасибо. – user3020047

+0

Добро пожаловать! –

+2

Худшая практика не указывать длину вашего символа/varchar. В конечном итоге вы сожжетесь, когда ваш –

1

Оператор + перегружен в SQL Server. Если какой-либо аргумент является числовым, то по умолчанию используется числовой плюс, а не конкатенация строк.

Решение заключается в преобразовании значений в строки перед началом работы. Что-то вроде:

cast(@PageNumber as varchar(255)) 

Обратите внимание, что при использовании cast() или convert(), вы всегда должны включать в себя длину типа.

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