【问题标题】:Error parsing query in SQL Server Compact在 SQL Server Compact 中解析查询时出错
【发布时间】:2012-03-11 15:48:14
【问题描述】:

我正在使用 WebMatrix 运行我的查询,我认为它是正确的,但是我遇到了一个错误。

我的查询如下:

   var result = db.Query(
                @"SELECT e.event_id, e.title, e.description, e.event_start, e.event_end, e.group_id, e.recurring
                FROM   event e
                JOIN   Membership m ON m.GroupID = e.group_id
                WHERE  e.recurring = 0
                AND    m.UserID = @0
                AND    e.event_start >= @1
                AND    e.event_end <= @2
                UNION ALL
                SELECT e.event_id, e.title, e.description, DATEADD(week, w.weeks, e.event_start), DATEADD(week, w.weeks, e.event_end), e.group_id, e.recurring
                FROM   event e
               JOIN   Membership m ON m.GroupID = e.group_id
               CROSS JOIN 
                ( SELECT  row_number() OVER (ORDER BY Object_ID) AS weeks
                  FROM SYS.OBJECTS
                ) AS w
                WHERE  e.recurring = 1
                AND    m.user_id = 4;
                AND    e.event_start >= @4
                AND    e.event_end <= @5", userID, start, end, userID, start, end
            );

错误是:

System.Data.SqlServerCe.SqlCeException (0x80004005):有一个 解析查询时出错。 [令牌行号=10,令牌行偏移量= 38,错误的令牌 = OVER ] at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 小时)在 System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()

我将查询保存在 .cs 文件中。我被告知我应该创建一个存储过程,因为 SQL Server compact 可能不支持 OVER 函数,这是正确的吗?如何为此查询创建存储过程?

【问题讨论】:

  • Simon,您似乎遇到了很多想要在 SQL Server Compact 中使用 SQL Server 语法的情况,但语法并非 100% 兼容。您是否考虑过在 SQL Server 2012 中使用 Express 或新的 LocalDb?在回答之前观看此演示文稿:channel9.msdn.com/posts/SQL11UPD03-REC-07
  • 在标签中添加了精简版...我认为 CE 根本不支持 row_number

标签: c# sql sql-server stored-procedures sql-server-ce


【解决方案1】:

在 FROM 之后,您可以列出多个用逗号分隔的表,结果将是所有这些表的 CROSS JOIN。

但是您不能在 JOIN 之后使用逗号语法。相反,写出 CROSS JOIN:

JOIN   Membership m 
ON     m.GroupID = e.group_id
CROSS JOIN 
       (
       SELECT  row_number() OVER (ORDER BY Object_ID) AS weeks
       FROM SYS.OBJECTS
       ) AS w

【讨论】:

  • 感谢您的回复。我可以在我的服务器上运行此查询的最佳/最简单的方法是什么?目前它完全是使用 WebMatrix/SQL Server CE 制作的。我担心它会花费大量的工作来迁移所有内容并更改我的代码! :(
  • 如果您要查找周数列表,创建一个表格并用数字 1 到 53 填充它应该可以解决问题吗?
  • 我现在已迁移到 SQL Server,但出现错误">关键字“WHERE”附近的语法不正确。知道为什么会出现这种情况吗?
  • 我已经更新了上面的代码以显示我当前正在运行的内容。
  • 这里可能是分号:m.user_id = 4; SQL Server 将分号解释为语句结束。
【解决方案2】:

似乎 Sql Server CE 4.0 不支持 ROW_NUMBER 和其他窗口函数:(

【讨论】:

  • :(我有什么办法可以解决这个问题吗?
  • 您使用 row_number 生成数字序列 - 可能您需要在静态表中生成它。这不是优雅的解决方案,但总比没有好。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多