2011-08-31 45 views
0

这是严重的问题:是否在Sql查询分析器?来自VS-2005的模糊Sql错误

我有面子的怪现状,我已经测试了以下查询SQL查询分析器:

insert into PLCommonTotal(CmnTotal) 
select 
case 
when p.NetpurTot > s.NetsalTot then 
(
select NetpurTot from PLPurchaseTotal 
) 
else 
(
Select NetsalTot from PLSaleTotal 
) 
end 
from PLPurchaseTotal p 
join PLSaleTotal s 
on p.companyID=s.companyID 

select * from PLCommonTotal 

它正从SQL查询分析器工作得很好没有错误。

现在看看同一个查询中VS-2005:

string tot5 = " insert into PLCommonTotal(CmnTotal)" + 
       " select" + 
       " case" + 
       " when p.NetpurTot > s.NetsalTot then" + 
       " (" + 
       " select NetpurTot from PLPurchaseTotal" + 
       ")" + 
       " else" + 
       " (" + 
       " Select NetsalTot from PLSaleTotal" + 
       ")" + 
       " end" + 
       " from PLPurchaseTotal p" + 
       " join PLSaleTotal s" + 
       " on p.companyID=s.companyID"; 
      SqlCommand comcmd = new SqlCommand(tot5, con); 
      comcmd.Transaction = trans; 
      comcmd.ExecuteNonQuery(); 

这是抛出SQL错误:“子查询返回多个值。当子查询遵循=!= < = < =>> =或子查询使用表达式时,这是不允许的。声明已被定为“。

我想问一下,如果它不被允许,为什么它从SQL查询分析器执行没有任何错误?

SQL Team是否有错误?

回答

2

如您所写的查询,如果您在PLPurchaseTotalPLSaleTotal中有多行,则会发生这种情况。我认为你没有在SSMS和VS-2005中使用相同的数据库。

另一方面,我怀疑这是您正在寻找的查询。

insert into PLCommonTotal(CmnTotal) 
select 
    case 
    when p.NetpurTot > s.NetsalTot 
    then p.NetpurTot 
    else s.NetsalTot 
    end 
from PLPurchaseTotal p 
    join PLSaleTotal s 
    on p.companyID=s.companyID 
+0

是的,这是我以后用它,但它不是我的问题。根据你的陈述如果我使用Sql Server-2000比它可以在VS-2005中创建问题,因为那里有Sql-2005工具 – mahesh

+0

......你是否说过,对于transact sql,sql server-2000和2005有不同的机制。 – mahesh

+0

@mahesh - 不,db版本之间没有区别。这是表中包含什么数据的问题,所以我认为你使用不同内容的数据库。如果表中的行少于两行,则原始查询不会显示任何错误。当您在子查询中指定表名时,您将再次使用整个表*,而不是您在主查询的from子句中指定的表。 –