2011-08-23 46 views
2

我在使用UDF將CSV字段變成表格後使用SQL Server 2008 PIVOT函數。SQL Server 2008:PIVOT引發錯誤'varchar值'xxx'的轉換溢出了一個int列。'

爲了顯示此錯誤,我將第一步驟中的CSV字段添加到UDF以獲取我在下面的代碼示例中手動創建的表格。

CREATE TABLE #TCMDRES (
    SYS_NR BIGINT, 
    DAT_TE VARCHAR(150), 
    ID CHAR(1) 
) 

-- ,,,,,,WIN ASDF v2,20100406.BAK,32515325772,32514331136, 
-- After being separated and put into columns 1-11... 
INSERT INTO #TCMDRES 
VALUES(1,'','X'),(2,'','X'),(3,'','X'),(4,'','X'),(5,'','X'),(6,'','X'),(7,'WIN ASDF v2','X'), 
(8,'20100406.BAK','X'),(9,'32515325772','X'),(10,'32514331136','X'),(11,'','X') 

SELECT * 
FROM #TCMDRES 

-- This errors out with: 
-- Msg 248, Level 16, State 1, Line 16 
-- The conversion of the nvarchar value '32514331136' overflowed an int column. 
SELECT ID, [8] AS FIL_NA, [10] AS FIL_SZ_NR 
FROM 
    (
    SELECT DAT_TE, SYS_NR, ID 
    FROM #TCMDRES a 
    ) a 
PIVOT (MAX(DAT_TE) FOR SYS_NR IN ([8],[10])) AS pvt 
WHERE [10] <> 0 

DELETE FROM #TCMDRES 

-- Try again but drop the last two digits from column 10... 
INSERT INTO #TCMDRES 
VALUES(1,'','X'),(2,'','X'),(3,'','X'),(4,'','X'),(5,'','X'),(6,'','X'),(7,'WIN ASDF v2','X'), 
(8,'20100406.BAK','X'),(9,'32515325772','X'),(10,'325143311','X'),(11,'','X') 

SELECT ID, [8] AS FIL_NA, [10] AS FIL_SZ_NR 
FROM 
    (
    SELECT DAT_TE, SYS_NR, ID 
    FROM #TCMDRES a 
    ) a 
PIVOT (MAX(DAT_TE) FOR SYS_NR IN ([8],[10])) AS pvt 
WHERE [10] <> 0 

DROP TABLE #TCMDRES 

總之,如果你試圖PIVOT甚至當它存儲爲VARCHAR一個較大的值,它沒有試圖將它轉換爲INT

有沒有人有任何想法如何解決這個問題,或者如果它是可解決的?似乎是PIVOT功能的限制...

+0

我明白什麼是錯誤的說法,但爲什麼是PIVOT試圖將VARCHAR轉換爲INT? – Brad

+1

+1用於發佈可用代碼。我總是喜歡有可用的測試數據,使它更容易! – JNK

回答

6

這是您的WHERE子句。 0INT。試試這個(在測試工作對我來說):

WHERE [10] <> CAST(0 as bigint)

另外,Lamak

另一種方法是WHERE [10] <> '0'

+1

+1 - 就是這樣,另一種方式是'WHERE [10] <>'0'' – Lamak

+0

@Lamak - 好點! – JNK

相關問題