SQL Server 2008: PIVOT выдает ошибку «Преобразование значения varchar« xxx »переполнило столбец int». - PullRequest
2 голосов
/ 23 августа 2011

Я использую функцию SQL Server 2008 PIVOT после преобразования поля CSV в таблицу с использованием UDF.

Чтобы показать эту ошибку, я исключаю первый шаг, который CROSS APPLY переводит поле 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 ...

1 Ответ

6 голосов
/ 23 августа 2011

Это ваше WHERE предложение. 0 - это INT. Попробуйте это (работал в тестировании для меня):

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

В качестве альтернативы, за Lamak:

другой путь будет WHERE [10] <> '0'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...