现在这个让我发疯了。它就像尝试向我的QueriesTableAdapter
(键入的DataSet
)添加新查询并为其分配一个在SUBQUERY中获取参数的查询一样简单;类似的东西:
SELECT CONVERT(bit, CASE WHEN (SELECT ROUND(SUM(Amount), 2) FROM [Transaction]
WHERE UserID = @UserID) >= 9.99 THEN 1 ELSE 0 END)
向导返回must declare scalar variable @UserID
。
我已经使用ADO.NET超过8年了,但之前没有注意到这个问题。我最近升级到SQL Server 2012 Express;也许与此有关?
更多信息
我刚刚通过删除子查询来解决手头的问题(就像所有好的开发人员一样):
SELECT CONVERT(bit, CASE WHEN ROUND(SUM(Amount), 2) >= 9.99 THEN 1 ELSE 0 END)
FROM [Transaction] WHERE (UserID = @UserID)
但这并没有解决实际问题,将一个参数传递给子查询。我进一步发现即使在CASE
子句中我也不能使用参数。例如,如果我宁愿避免在查询中硬编码价格(9.99)并将其替换为变量,但这样做会产生与上述相同的错误。
答案 0 :(得分:1)
看起来我找到了解决方法。它不漂亮,但它的工作原理。我欢迎任何比这更好的东西,不需要存储过程。
TableAdapter
似乎只从WHERE
子句中读取查询参数(可能是为了推断它们的类型),所以如果你也可以在WHERE
中引入你的变量,那么总是使用真实的条件当然,它会工作。类似的东西:
SELECT CONVERT(bit, CASE WHEN ROUND(SUM(Amount), 2) >= @Price THEN 1 ELSE 0 END)
FROM [Transaction] WHERE UserID = @UserID AND (Amount <= @Price OR Amount > @Price)
WHERE
子句的最后一部分是简单地引入@Price变量并定义其类型,并且对结果没有影响。希望SQL Server查询优化器在执行查询之前将截断此部分。