2011-12-02 111 views
1

這工作絕對沒問題SQL查詢轉換

Update TradeFlow 
set flt_TotalPriceUSD= 
(Select top 1 (flt_ExRate * TradeFlow.flt_TotalPrice) 
from ExchangeRate ex inner join DateConversion dc 
on ex.dtm_Date = dc.gDate and pDate=Convert(varchar,'01') + '/' 
+ Convert(varchar,'03') + '/' + Convert(varchar,'1389')) 

但是當我從它停止工作數據庫(TradeFlow.int_MonthTradeFlow.int_Year)與值代替它。 pdate是一個字符串

Update TradeFlow 
set flt_TotalPriceUSD = (Select top 1 (flt_ExRate * TradeFlow.flt_TotalPrice) 
from ExchangeRate ex inner join DateConversion dc 
on ex.dtm_Date = dc.gDate and pDate=Convert(varchar,'01') + '/' + 
Convert(varchar,TradeFlow.int_Month) + '/' 
+ Convert(varchar,TradeFlow.int_Year)) 

任何想法爲什麼?

+0

什麼 '停止工作' 的意思? – danihp

+0

停止工作意味着沒有獲得正確的結果 – maztt

+0

你會得到什麼錯誤?你最高的查詢是將nvarchar值轉換爲nvarchar值,無論如何,所以它不會出現錯誤 – Curt

回答

2

我的建議:

相反的:

Convert(varchar,TradeFlow.int_Month) ... 
Convert(varchar,TradeFlow.int_Year)) 

寫:

right('0' + rtrim(ltrim(str(TradeFlow.int_Month))), 2) ... 
right('0000' + rtrim(ltrim(str(TradeFlow.int_Year))), 4) ... 
+0

信用額正在解釋'停止工作';) – danihp

2
Update TradeFlow 
set flt_TotalPriceUSD= (Select top 1 (flt_ExRate * TradeFlow.flt_TotalPrice) 
    from ExchangeRate ex inner join DateConversion dc 
on ex.dtm_Date = dc.gDate and 
    --if pDate is varchar type (`dd/MM/yyyy`) 
    pDate= '01/' + right('0' + cast(TradeFlow.int_Month as varchar), 2) + '/' + 
     cast(TradeFlow.int_Year as varchar) 

    --if pDate is datetime type 
    pDate= cast(TradeFlow.int_Year as varchar) + 
     right('0' + cast(TradeFlow.int_Month as varchar), 2) + '01' 
+0

我認爲varchar是varchar( 1)。也許你的casth應該是varchar(2)。不是這樣?對不起,如果沒有,我從我的記憶中談起。 – danihp

+2

實際上,根據[Books Online](http://msdn.microsoft.com/zh-cn/library/ms176089.aspx),它是CAST或CONVERT上下文中的「varchar(30)」:*當n沒有在數據定義或變量聲明語句中指定,默認長度爲1.當使用CAST和CONVERT函數時未指定n時,缺省長度爲30 * –

+0

感謝Michal澄清! (1) – danihp