【问题标题】:There was an error parsing the query. [ Token line number = 1,Token line offset = 39,Token in error = ( ]解析查询时出错。 [令牌行号=1,令牌行偏移量=39,错误令牌=(]
【发布时间】:2017-03-28 14:42:20
【问题描述】:

我正在使用 WinForms 应用程序。我的要求是按需从 sql 加载数据(即在移动到该页面时为一个页面加载 100 条记录)。所以我在 SqlCommand 下进行了尝试,但它在以下命令中的“ROW_NUMBER()”语法的位置引发了异常,

SELECT * 
FROM (SELECT *
      , ROW_NUMBER() (ORDER BY [ID]) AS RowNum 
      FROM [tblVGTest] 
      WHERE [ID]) AS Temp 
WHERE RowNum BETWEEN 0 AND 100

请告诉我,命令中是否有任何错误或为我的方案提供任何建议。

谢谢

【问题讨论】:

  • 是mysql吗?看起来像 SQL Server (mssql)
  • 查询完全错误。ORDER BY 子句总是在WHERE 子句之后。 WHERE 在您的查询中没有任何条件。只有WHERE [ID] 是什么意思?

标签: c# sql-server winforms sqlcedatareader


【解决方案1】:

您忘记将OVER() 子句与ROW_NUMBER 一起使用。

尝试以下查询。

SELECT * FROM (SELECT * , ROW_NUMBER() OVER (ORDER BY [ID]) AS RowNum 
  FROM [tblVGTest] ) AS Temp WHERE RowNum BETWEEN 0 AND 100

我已从中删除 WHERE 子句,因为它没有任何标准。如果你需要,你可以放。

【讨论】:

  • 嗨@Chetan,感谢您的建议。我已经按照你说的尝试过,但我仍然得到同样的例外。这种情况还有其他可能吗?
  • 没有其他可能。这是一个语法错误。我在本地数据库上运行了上述查询,只更改了表名,我得到了完美的输出。我在 SQL Server 数据库上运行了这个查询。你在使用其他数据库吗?您是否尝试在 Sql Management Studio 中运行查询。我建议从这里复制查询,粘贴到查询窗口中并运行它。
  • 嗨@Chetan,谢谢。我没有用 Sql Management Studio 尝试过。我在我的项目内部使用了 (.sdf) 文件,并通过 SqlCeConnection 和 SqlCeAdapter 从中读取值。
  • 好的。如果您使用的是 SQL Server Compact Edition,则消息是 ROW_NUMBER() 在 SQL Server Compact Edition 中不可用。您需要使用SqlCeResultSet.Seek() 进行分页。
  • 嗨@Chetan,谢谢你的信息。您能否提供任何论坛或文档以使用 SqlCeResultSet.Seek() 从 SDF 文件中选择 100 条记录。我已经搜索过了,但我无法获得有关如何使用 SqlCeResultSet.Seek() 的确切详细信息
【解决方案2】:

如果你使用 SQL Server Compact 4.0,你可以使用 OFFSET / FECTCH 语法:

SELECT * FROM TransactionHistory   
ORDER BY TransactionDate DESC
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多