Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将参数传递给子查询_.net_Tsql_Ado.net_Subquery_Strongly Typed Dataset - Fatal编程技术网

.net 将参数传递给子查询

.net 将参数传递给子查询,.net,tsql,ado.net,subquery,strongly-typed-dataset,.net,Tsql,Ado.net,Subquery,Strongly Typed Dataset,现在这件事快把我逼疯了。它变得非常简单,只需尝试向myQueriesTableAdapter(键入的DataSet)添加一个新查询,并为其分配一个在子查询中使用参数的查询;比如: SELECT CONVERT(bit, CASE WHEN (SELECT ROUND(SUM(Amount), 2) FROM [Transaction] WHERE UserID = @UserID) >= 9.99 THEN 1 ELSE 0 END) SELECT CONVERT(bit

现在这件事快把我逼疯了。它变得非常简单,只需尝试向my
QueriesTableAdapter
(键入的
DataSet
)添加一个新查询,并为其分配一个在子查询中使用参数的查询;比如:

SELECT CONVERT(bit, CASE WHEN (SELECT ROUND(SUM(Amount), 2) FROM  [Transaction]
       WHERE UserID = @UserID) >= 9.99 THEN 1 ELSE 0 END)
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)
向导返回
必须声明标量变量@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)进行硬编码,并将其替换为Variable,但这样做会产生与上面相同的错误。

看起来我找到了解决方法。它不漂亮,但很管用。我欢迎任何比这更好、不需要存储过程的东西

似乎
TableAdapter
只从
WHERE
子句中读取查询参数(可能是为了推断它们的类型),因此如果您也可以在
WHERE
中引入变量,当然可以使用始终为真的条件,它将起作用。比如:

SELECT CONVERT(bit, CASE WHEN (SELECT ROUND(SUM(Amount), 2) FROM  [Transaction]
       WHERE UserID = @UserID) >= 9.99 THEN 1 ELSE 0 END)
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)
选择转换(位,四舍五入时的大小写(总和(金额),2)>=@Price,然后选择1,否则0结束)
来自[Transaction],其中UserID=@UserID和(Amount@Price)
WHERE
子句的最后一部分只是简单地引入@Price变量并定义其类型,对结果没有影响。希望SQL Server查询优化器在执行查询之前截断此部分