将参数传递给子查询

时间:2013-12-30 07:54:05

标签: .net tsql ado.net subquery strongly-typed-dataset

现在这个让我发疯了。它就像尝试向我的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)并将其替换为变量,但这样做会产生与上述相同的错误。

1 个答案:

答案 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查询优化器在执行查询之前将截断此部分。