2017-01-23 177 views
-1

當不再使用oracle數據庫時,我們的重點是將所有查詢語句從Oracle轉換爲SQL Server(T-SQL)語句。我在解碼時遇到了一些問題,下面這行我一直試圖改變它,但是當我在sql server中運行它進行測試時,它給了我一些錯誤。將Oracle解碼語句轉換爲SQL Server T-SQL語句

Dim query As String = "SELECT DocType, 
docyear, 
docmonth, 
DECODE(docmonth, NULL, NULL, '0', '- All Months -', TO_CHAR(TO_DATE(docmonth||'/01/2008', 'MM/DD/YYYY'), 'docmonth')) 
monthAlpha, 
DID 
from dbo.Document where XALASKAID = '" & LicenseNumber & "' and DOCTYPE like '%Report%'" 

但是這條解碼線路導致錯誤。

+1

「我們的重點是將所有查詢語句從oracle轉換爲sql語句」.... Oracle使用SQL語句!這是什麼意思,因爲它沒有意義? – MT0

+0

「有些錯誤」 - 謹慎分享? –

+0

所以你從VBA調用查詢?你有什麼錯誤? – Alfabravo

回答

0

你能嘗試CASE語句呢?

Dim query As String = " 
SELECT 
docType, 
docyear, 
docmonth, 
TO_CHAR(TO_DATE(docmonth||'/01/2008', 'MM/DD/YYYY'), 'docmonth')) 
CASE 
    WHEN docmonth IS NULL THEN NULL 
    WHEN docmonth = '0' THEN '- All Months -' 
    WHEN docmonth >= AND docmonth <= 12 THEN DATENAME(month, DATEADD(month, docmonth, -1)) 
END CaseDocMonth, 
monthAlpha, 
DID 
FROM dbo.Document 
WHERE XALASKAID = '" & LicenseNumber & "' 
AND DOCTYPE like '%Report%';" 

我已經written about DECODE before,並且案件通常反正首選,因爲它更容易閱讀,並具有更大的靈活性。

+0

其餘工作正常但 MS SQL不明白: 'TO_CHAR(TO_DATE(docmonth ||'/ 01/2008',' MM/DD/YYYY'),'docmonth'))' 我只是在列中有0到12的值,並試圖用措辭(月字)而不是數字顯示它。 –

+0

啊,我明白了。這兩個函數也是Oracle特有的。我已閱讀了關於獲取月份名稱的其他評論,並且我認爲DATENAME函數應該可以做到這一點。我已經更新了我的答案。我現在無法訪問SQL Server,但是讓我知道這個查詢是否有問題。 – bbrumm

+0

感謝修改,你真棒它的工作原理!!!!,你的代碼幫助我很多轉換。我的結束腳本現在是: 'Dim query As String =「SELECT DocType,docyear,CASE when docmonth IS NULL THEN NULL」&_ 「WHERE docmonth ='0'THEN' - All Months - 'WHEN docmonth> = 1 AND docmonth <= 12「&_ 」THEN DATENAME(month,DATEADD(month,docmonth,-1))END DocMonth,dbo.Document中的DID,其中XALASKAID ='「&LicenseNumber&」'和DOCTYPE如'%Report% 「「' –

0

使用Oracle專有的功能(DECODETO_CHARTO_DATE),甚至在SQL Server的連接符(||)不會讓你遠。

2.

case ... when null將無法​​正常工作。

例如

declare @t table (i int) 
insert into @t (i) values (null) 
select case i when null then 1 else 2 end as x from @t 

+---+ 
| x | 
+---+ 
| 2 | 
+---+ 

代替

case x when null then ... when y then ... when z then .. else ... end 

你將不得不使用

case when x is null then ... when x = y then ... when x = z then ... else ... end