【发布时间】: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