在sql Server中,使用整数变量构建动态sql

在sql Server中,使用整数变量构建动态sql,sql,Sql,我正在构建这个动态sql,但在执行时出错 Conversion failed when converting the varchar value 'SELECT DDoSAttacksId, AttackId, TargetIP, PeakBPS, DateStarted

我正在构建这个动态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.
注意:它可以插入IPAddress,但不能插入整数值

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 ('+@IPAddressList+')) AS DDosAttacksRows
        WHERE
            (Row between ('+@PageNumber+' * ('+@PageSize+' - '+@PageSize+')) AND ('+@PageNumber+' * ('+@PageSize+' - 1)))';

EXECUTE sp_executesql @sql

我可以将数字硬编码到它们的位置,并执行得很好……例如(在(1*(20-20))和(1*(20-1))之间的行)

您可以尝试以下方法:

'(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)))';
cast(@PageNumber as varchar(255))

更新了我的答案,提供了一个铸造瓦查尔的长度,因为KM的回应如下。谢谢你的解释

您可以尝试以下方法:

'(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)))';
cast(@PageNumber as varchar(255))

更新了我的答案,提供了一个铸造瓦查尔的长度,因为KM的回应如下。谢谢你的解释

SQL Server中的
+
运算符过载。如果任何参数是数字,则默认为数字加号,而不是字符串串联

解决方案是将值转换为字符串。比如:

'(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)))';
cast(@PageNumber as varchar(255))

请注意,在使用
cast()
convert()
时,应始终为类型包含一个长度。

SQL Server中的
+
运算符重载。如果任何参数是数字,则默认为数字加号,而不是字符串串联

解决方案是将值转换为字符串。比如:

'(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)))';
cast(@PageNumber as varchar(255))

请注意,在使用
cast()
convert()
时,应始终为类型包含长度。

似乎您正试图通过将类型
int
(即,
@PageNumber
连接在
中('+@PageNumber+
行之间)来构造
NVARCHAR
字符串这是无效的。它可能是重复的。您试图通过连接
int
(即,
@PageNumber
)中的
@PageNumber
(在('+@PageNumber+行之间的行)类型来构造
NVARCHAR
字符串这是无效的。可能是重复的感谢它起作用了..感谢所有响应类似的人..谢谢。最糟糕的做法是不指定char/varchar的长度。当数据被截断时,您最终会被烧掉,因为默认值小于结果字符串。@KM关于您的评论,系统不会允许将
MAX
长度添加到
VARCHAR
CAST
?@user3020047中省略了一个长度时,为了帮助社区,您应该尽可能经常地标记答案。这有助于快速确定其他用户可能遇到的问题的解决方案。@Anthony Forloney,任何SQL Server都不会这样做默认varchar为max。当声明变量(如
DECLARE@x varchar
时,它将默认为
varchar(1)
。当使用在线转换(如答案中所示)时,它将默认为
varchar(30)
。SQL Server无法读懂您的心思,也无法理解您的需求,因此请始终选择适合您具体情况的数据类型和长度。您是程序员,请负责。请参阅“感谢它起到了作用”。感谢所有响应类似的人……谢谢。不为char/varchar指定长度是最糟糕的做法。您最终将获得burned当您的数据被截断时,因为默认值小于结果字符串。@KM关于您的评论,系统是否会将
MAX
长度分配给
VARCHAR
CAST
中省略了一个长度时?@user3020047为了帮助社区,您应该将答案标记为接受often尽您所能。它有助于快速确定其他用户可能遇到的问题的解决方案。@Anthony Forloney,没有SQL Server不会将varchar默认为max。当声明变量(如
DECLARE@x varchar
时,它将默认为
varchar(1)
。当使用如答案中所示的在线转换时,它将默认为
varchar(30)
。SQL Server无法读懂您的心思,也无法理解您的需求,因此请始终选择适合您具体情况的数据类型和长度,您是程序员,请负责。请参阅