【问题标题】:.NET Error with Dynamic T-SQL.NET 动态 T-SQL 错误
【发布时间】:2012-06-07 06:17:42
【问题描述】:

我正在尝试使用存储过程在 .NET 中创建 TableAdapter,但我收到错误“关键字 'WHERE' 附近的语法不正确”。

我已将存储过程中的问题缩小到以下几行:

IF @NumRows > 0
    SET @SQL += N' WHERE T1.RowNumber BETWEEN 1 and 10'
ELSE
    SET @SQL += N' WHERE T1.RowNumber > 0'

@NumRows是输入参数,默认为0。

但是,如果我删除其中任何一行,一切正常(当没有 IF/ELSE 语句时,两个 WHERE 子句本身都可以正常工作)。看起来 .NET 几乎忽略了 IF/ELSE 并尝试添加 WHERE 子句两次。

如果我这样更改它也可以正常工作:

IF @NumRows > 0
    SET @SQL += N''
ELSE
    SET @SQL += N' WHERE T1.RowNumber > 0'

其中一个 WHERE 子句已被删除,.NET 端不再存在冲突。所以我很确定它与 2 WHERE 子句有关,而不是其他任何东西。

存储过程在 SQL Server 中运行得非常好,即使单击“预览数据”也会出现错误,它甚至可以在 .NET 中运行。唯一的问题是它不会自动填充我创建报告所需的字段列表。

有没有人看过这个并有建议?

【问题讨论】:

  • 在这些行之前@SQL 的值是什么?
  • WHERE T1.RowNumber 对这两种情况都是通用的。尝试将其拉出,然后将 BETWEEN 1 and 10> 0 附加到您的动态语句中。
  • .NET 与此无关。这完全是一个 TSQL 问题。当通过 SSMS 调用时,sproc/TSQL 是否单独工作 - 这才是最重要的。 .NET 绝不会尝试解析它。它完全在 SQL 服务器上执行。
  • @Phillip 大多数工具在解释使用动态 SQL 的代码架构方面存在重大问题。您应该明确指出是 IDE 有这个问题,而不是运行时。
  • @PhillipTheriault 为什么不将“最终答案”移到问题本身的答案中?

标签: c# sql-server stored-procedures dynamic-sql tableadapter


【解决方案1】:

错误出现在 DataSet (.xsd) 文件 - 可视化设计器中。右击,然后转到Add>TableAdapter,建立数据库连接,选择存储过程,点击进入Finish,然后显示错误。它仍然链接到 sproc,并且可以在我单击 Preview Data 时运行,但它无法确定 sproc 中有哪些字段。当然,我可以手动添加字段,但这似乎是一个不应该存在的愚蠢问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多