2011-08-31 40 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子句中指定的表。 –