Преобразование INT в строку при использовании функции STUFF в SQL Server 2016 - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь преобразовать INT, но возникла проблема с преобразованием.

Преобразование не удалось при преобразовании значения nvarchar '245428,246425' в тип данных int.

Используемый мной запрос:

SELECT STUFF
       ( 
        (
            SELECT DISTINCT ',' + CONVERT(VARCHAR(20), NumField) 
            FROM Table A 
            WHERE ID = 218554 
            FOR XML PATH('')
        ) ,1,1,''
       )

Я использую это как подзапрос в большой таблице, например:

SELECT 
    Field1,
    Field2, 
    CASE WHEN criteria = '1'
         THEN     (SELECT STUFF( 
            (
                SELECT DISTINCT ',' + CONVERT(VARCHAR(20), NumField) 
                FROM Table A 
                WHERE ID = 218554 
                FOR XML PATH('')
            ) ,1,1,''
           ))
    END 
FROM 
    Table B

Запрос STUFF работает нормально, когда он выполняется сам по себе, но когда я запускаю его в полном запросе, возникает ошибка преобразования.

1 Ответ

2 голосов
/ 23 апреля 2019

Я не думаю, что вы не показываете полный запрос - или, по крайней мере, полное выражение case. Выражение case возвращает значение single с одним типом.

Когда возникают конфликты типов, SQL Server должен определить единый общий тип в соответствии со своими правилами. Если один then возвращает целое число, а другой возвращает строку, то выражение case является целым числом ( не строка). Итак, строка преобразуется в целое число.

Вы можете увидеть эту проблему с гораздо более простой логикой:

select (case when 1=1 then 'a' else 0 end)

Даже если else никогда не выполняется, тип выражения определяется во время компиляции - и 'a' нельзя преобразовать в целое число.

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