2015-04-01 64 views
0

我對SQL查詢不是很熟悉。最近我一直試圖建立使用SQL Server的unpivot功能的查詢,但我現在面臨一個錯誤,指出:面向SQL中列數據類型的困難Unpivot查詢

的類型與在UNPIVOT列表中指定的其他 列的類型列「U_ItemModality」的衝突。

這裏是我的查詢:

select 
    cast(unpvt.ItemCode collate database_default AS VARCHAR(30)) as ItemCode, 
    cast(unpvt.attribute collate database_default AS VARCHAR(30)) as attribute, 
    cast(unpvt.value collate database_default AS VARCHAR(30)) as value 
from [OITM] 
unpivot (
    value for attribute in (U_Mfg_Part_Num, U_Part_Descriptor, U_ItemModality) 
) unpvt 
inner join [@AECTRANDATA] as WI 
    on unpvt.ItemCode = WI.U_ObjectKeyValue 
inner join OITM AS IM 
    on WI.U_ObjectKeyValue = IM.ItemCode 
where 
    WI.U_ObjectType ='4' 

在此查詢,如果我刪除u_itemmodality它將運行。其他兩列的大小爲100字符,但此列的大小爲30字符。

如何克服這種情況?

回答

0

使用UNPIVOT時,數據類型長度必須相等。有關更多信息,請參見此question。您應該將U_ItemModality轉換爲VARCHAR(100),以便它具有與其他兩列相同的長度。

select 
    cast(unpvt.ItemCode collate database_default AS VARCHAR(30)) as ItemCode, 
    cast(unpvt.attribute collate database_default AS VARCHAR(30)) as attribute, 
    cast(unpvt.value collate database_default AS VARCHAR(30)) as value 
from (
    select 
     U_Mfg_Part_Num, 
     U_Part_Descriptor, 
     U_ItemModality = convert(varchar(100), U_ItemModality) 
    from [OITM] 
)t 
unpivot (
    value for attribute in (U_Mfg_Part_Num, U_Part_Descriptor, U_ItemModality) 
) unpvt 
inner join [@AECTRANDATA] as WI 
    on unpvt.ItemCode = WI.U_ObjectKeyValue 
inner join OITM AS IM 
    on WI.U_ObjectKeyValue = IM.ItemCode 
where 
    WI.U_ObjectType ='4' 
+0

我還沒有測試過上面的查詢,我也不熟悉'UNPIVOT'語法。謹慎行事。 – 2015-04-01 08:19:21

+0

請注意,如果外部選擇的CAST(... AS VARCHAR(30))長度超過30個字符,它將截斷您的文本。 – mheptinstall 2015-04-01 08:22:48

+0

@mheptinstall,很好。爲了避免截斷,長度應該是'100'。 – 2015-04-01 08:23:35