如何从查询字符串中分离“选择顶部 * x”?
Posted
技术标签:
【中文标题】如何从查询字符串中分离“选择顶部 * x”?【英文标题】:How to seperate the ''select top * x" from query string? 【发布时间】:2021-02-19 04:52:47 【问题描述】:我正在尝试向数据库发送查询字符串,但收到此错误 -->
TOP 不能作为 OFFSET 在同一个查询或子查询中使用。
当我调试查询字符串时,我发现
"select * from TABLE"
更改为 "select * from TABLE Fetch Next 50 Rows Only"
(其中列数 =50(已设置))。
所需输出
select top * x from [TABLE]
到
select * from [TABLE] Fetch Next x Rows Only
我尝试了什么
我尝试使用,查找并将'top * x'替换为整数x和*
string CommandText = "select * from TABLE";
CommandText =CommandText
+ orderby + " OFFSET " + (request.Page - 1) * request.PageSize
+ " ROWS FETCH NEXT " + request.PageSize + " ROWS ONLY";
请帮助我找到解决方案。
【问题讨论】:
我不清楚您要做什么。首先,以这种方式构建 SQL 查询是危险的,可能会导致 SQL 注入。其次,我相信 FETCH 关键字只适用于游标,因此在这种情况下它不起作用。请说明您要完成的工作,我可能会提供帮助。 为什么要在已经检索到所需行数的 SQL 语句上添加TOP
?
@BrandonJohnson 在 SQL Server 中,在 SELECT 语句中使用 FETCH 是有效的
您应该绝对不要从外部源运行任意 SQL。绝不。这是一个安全漏洞,你可以开着卡车穿过。
@Cleptus 参数化查询不能解决问题。如果这个页面是面向用户的,精明的用户会注意到 SQL 并意识到他们可以编写任何他们想要的 SQL。然后你就有了一个安全漏洞。
【参考方案1】:
为了避免字符串连接以生成 SQL 语句,您可以(恕我直言,您应该)使用参数化查询。这是一种称为 SQL 注入的安全风险,您应该始终避免。例如:
string commandText = @"
SELECT * FROM dbo.TABLE
ORDER BY orderColum
OFFSET @offset ROWS
FETCH NEXT @page ROWS ONLY";
command.CommandText = commandText;
command.Parameters.Add(SqlDbType.Int, "@offset").Value = (request.Page - 1) * request.PageSize;
command.Parameters.Add(SqlDbType.Int, "@page").Value = request.PageSize;
请注意,参数化查询确实有一个好处,数据库引擎可能会为它制定一个执行计划,并且未来使用相同 CommandText
的查询将执行得更快,因为该计划不管参数中具有不同的值。
【讨论】:
以上是关于如何从查询字符串中分离“选择顶部 * x”?的主要内容,如果未能解决你的问题,请参考以下文章
如何从输入字符串中分离整数并将它们转换为 int 类型以允许对它们进行计算