如何从查询字符串中分离“选择顶部 * 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”?的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中分离许多不同的单词(Java)

如何从输入字符串中分离整数并将它们转换为 int 类型以允许对它们进行计算

如何从 PySpark DataFrame 的列中分离特定字符并使用它们形成一个新列?

从元素中分离多行文本

如何从它的消息中分离异常类型

从给定的字符串中分离字符串