【问题标题】:Select N Row with DB2 in Visual Studio在 Visual Studio 中使用 DB2 选择 N 行
【发布时间】:2019-11-01 21:37:26
【问题描述】:

我想在 Visual Studio 中从 DB2 中获取前 95 个数据。我正在使用表适配器,我有这个查询,

SELECT * FROM ASEINDTA.TRX_BWS WHERE (DKLDATE = '2019-10-31') 仅获取前 95 行

或者这个

SELECT * FROM ASEINDTA.TRX_BWS WHERE (DKLDATE = '2019-10-31') 按 Col[1]...Col[n] 排序 仅获取前 95 行

但是当我单击查询生成器时,会出现此错误。

但是当我在 DBVisualizer 中尝试时,它可以工作。我如何获得这些数据?帮助将不胜感激。谢谢

【问题讨论】:

  • 您的查询确实需要有一个ORDER BY 子句才能使请求“第一”95 行才有意义。您使用哪些列进行排序?
  • 这样做SELECT TOP(95) [col1], [col2], [col3] FROM ASEINDTA.TRX_BWS WHERE DKLDATE like '%2019-10-31'% order by col1 desc
  • @TimBiegeleisen 你好,我之前尝试过ORDER BY,但没有提及,也不管用。
  • 编辑您的问题以显示 c# 代码。不要在查询中使用 dbms 特定语法(首先获取...)。您可以使用 table-adapter/DataAdapter 填充方法的参数来限制结果集。您还可以通过将查询封装在例程中来在 dbms 端进行限制。

标签: c# visual-studio db2


【解决方案1】:

一种方法适用于 DB2,而大多数其他数据库将使用 ROW_NUMBER 和子查询:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY some_col) rn
    FROM ASEINDTA.TRX_BWS
    WHERE DKLDATE = '2019-10-31'
)

SELECT *
FROM cte
WHERE rn <= 95;

或者,不使用 CTE 的内联版本:

SELECT *
FROM
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY some_col) rn
    FROM ASEINDTA.TRX_BWS
    WHERE DKLDATE = '2019-10-31'
) t
WHERE rn <= 95;

【讨论】:

  • 嗯,它在 Visual Studio 中的表适配器。
  • @Syafiqur__ 然后使用内联版本,q.v。我更新的答案。
  • 不。无法使用该查询。
【解决方案2】:

去掉where子句的括号:

SELECT * FROM ASEINDTA.TRX_BWS WHERE DKLDATE = '2019-10-31' Fetch First 95 Rows Only

【讨论】:

    【解决方案3】:

    看来问题不在于 db2-server 本身,而在于您用来执行查询的工具。您说过,如果您在“DBVisualizer”中运行相同的程序,它可以正常工作。

    查看 db2 文档以了解此错误:sqlcode -104 sqlstate 42601

    这个错误似乎是由 SYSPROC.ADMIN_CMD 存储过程返回的。 此过程旨在远程在目标数据库中运行 db2 管理命令。它不是为运行查询而设计的……所以,这个 proc 的解析器只是 db2 解析器的一个子集,仅用于特定的管理命令。 所以它抱怨您查询中的 FETCH 令牌。

    似乎您正在使用的工具 'I'm using table adapter'(不知道它是什么)正在调用此 SYSPROC.ADMIN_CMD 来执行查询,但它应该是改为使用常规 CLI 界面。

    我不知道您使用的是什么工具。但试着看看它是否有某种设置,这样你就可以改变这种行为。

    以下是 ADMIN_CMD proc 可以执行的管理命令列表: https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0012547.html.

    如您所见,那里没有 SELECT 语句。

    如果我尝试使用此 SP 执行简单的 SELECT ,我会从 db2 CLP 窗口直接在服务器上收到相同的错误。

    db2 "call SYSPROC.ADMIN_CMD('SELECT * FROM DEPARTMENT')"
    SQL0104N  An unexpected token "SELECT" was found following
    "BEGIN-OF-STATEMENT".  Expected tokens may include:  "ADD".  SQLSTATE=42601
    

    问候 塞缪尔·皮萨罗

    【讨论】:

      【解决方案4】:

      好的 我仔细查看了您发布的图像错误...

      查询错误。这与您在问题中发布的查询不完全相同。

      仔细查看图像错误,您会发现 Fetch 和 Rows 两个词被双引号括起来。

      SELECT ... FROM WHERE (...) "Fetch" First 95 "Rows" Only 
      

      从它们中删除双引号。

      如果您不是那样编写它们,那么在提交给 db2 引擎之前,您的工具似乎正在“改变”它。同样,不是 db2 服务器问题。

      问候

      【讨论】:

      • 你好,我一点击Query Builder按钮,双引号就出现了。我一开始尝试删除,它仍然出现在我的查询中。你说我的工具正在改变它是什么意思?
      • 我的意思正是你所描述的。此标记 (FETCH) 不应存在引号,它是语法的一部分。它不是命名标识符。看起来“查询生成器”并非旨在与其他 DBMS 语法一起使用,并且仅适用于预期的 MSSQL 语法。你需要使用“查询生成器”吗?它似乎无法识别关键字,并将其视为列别名,并在其周围加上双引号。
      • 是的,我需要,检查查询和预期结果
      • 通常,“查询构建器”只是帮助您构建 SELECT 语句的工具。没有它们也可以执行它们并检查预期结果。
      猜你喜欢
      • 2023-02-07
      • 2017-07-27
      • 1970-01-01
      • 2019-03-16
      • 2012-11-16
      • 1970-01-01
      • 2011-07-17
      • 2016-12-15
      • 2015-07-24
      相关资源
      最近更新 更多