2015-10-07 28 views
-1

我忙於在不同數據庫之間的SQL中使用UNION ALL。表達式類型數值對於分類無效

SELECT  CostValue AS [COST OF SALES], Customer AS [CUSTOMER CODE], DocumentType AS [DOCUMENT TYPE], Invoice AS [INVOICE NO], InvoiceDate AS [INVOICE DATE], 
        DATEPART(dd, InvoiceDate) AS [INVOICE DAY], Mass AS MASS, NetSalesValue AS SALES, NetSalesValue - CostValue AS [GROSS PROFIT], OrderType, 
        QtyInvoiced AS QUANTITY, SalesOrder, StockCode AS [STOCK CODE], TrnMonth AS [FIN MONTH], TrnYear AS [FIN YEAR], TrnYear * 100 + TrnMonth AS YYYYMM, 
        'SHP' AS COMPANY 
FROM   SomeCompanyA.dbo.SalesDetail 
WHERE  (LineType = 1) AND (TrnYear >= 2010) 
UNION ALL 
SELECT  CostValue AS [COST OF SALES], Customer AS [CUSTOMER CODE],  DocumentType AS [DOCUMENT TYPE], Invoice AS [INVOICE NO], InvoiceDate AS [INVOICE DATE], 
        DATEPART(dd, InvoiceDate) AS [INVOICE DAY], Mass AS MASS, NetSalesValue AS SALES, NetSalesValue - CostValue AS [GROSS PROFIT], OrderType, 
        QtyInvoiced AS QUANTITY, SalesOrder, StockCode AS [STOCK CODE], TrnMonth AS [FIN MONTH], TrnYear COLLATE DATABASE_DEFAULT AS [FIN YEAR], (TrnYear * 100) COLLATE database_default + TrnMonth AS YYYYMM, 
        'SGF' AS COMPANY 
FROM   SQLXXXXXX.SomeCompanyB.dbo.SalesDetail AS SalesDetail_1 
WHERE  (LineType = 1) AND (TrnYear >= 2010) 

我在執行時收到以下錯誤「表達式類型的數字是COLLATE子句無效」我認爲這是從這裏(TrnYear * 100)COLLATE database_default + TrnMonth AS YYYYMM

我不來了肯定還有其他什麼來分解這個,因爲我理解這是一個連接而不是一個隱式轉換。

請有人提供一些建議,如何正確施放此。

我也看過這裏Use Collate in CONCAT,但我不明白這是如何工作的,因爲我在一年中使用操作員。

也許我錯過了一些東西。任何意見,將不勝感激。

由於

+0

改爲使用:'CAST(TrnYear * 100 AS VARCHAR(100))+ TrnMonth AS YYYYMM' – lad2025

+0

@ lad2025感謝此。正如我在下面提到的那樣,我得到了像這樣轉換的算術溢出錯誤。我將搜索論壇的這個錯誤。歡迎任何建議。謝謝 – Metamorphosis

回答

2

COLLATE爲文本類型,以及(TrnYear * 100)的計算結果爲一個數字。在使用COLLATE之前,嘗試使用CAST((TrnYear * 100)AS VARCHAR)轉換爲varchar。

+1

非常感謝。從這裏我收到另一個錯誤。將varchar轉換爲數據類型數值的算術溢出錯誤。 SELECT TrnYear * 100 + TrnMonth AS YYYYMM FROM SomeCompanyA.dbo.SalesDetail UNION ALL SELECT CAST((TrnYear * 100)AS VARCHAR)+ TrnMonth AS YYYYMM FROM SQLXXXXXX.SomeCompanyB.dbo.SalesDetail AS ArTrnDetail_1 – Metamorphosis

+0

重讀SQL,不知道爲什麼你需要COLLATE。不是(TrnYear * 100)+ TrnMonth AS YYYYMM就足夠了,因爲它在UNION聲明的第一部分中是足夠的嗎? – davestevens

+0

如果我這樣做,並使用它,因爲它是在聲明的第一部分,我收到以下錯誤信息:「由於排序規則,未對字符串進行排序,因此無法執行字符串到varchar的隱式轉換衝突 – Metamorphosis