Как исправить проблему с усечением данных для столбцов в табличной переменной с типом данных как varchar (max) - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть табличная переменная со столбцом типа varchar(max). Я храню набор результатов другого запроса в этой табличной переменной. Длина результата, который я получаю при запросе этой таблицы, составляет 7870. Я хотел, чтобы этот результат был транспонирован с использованием разделителя запятых, и перед каждым значением мне приходилось добавлять «t». Но это привело к тому, что данные превысили 8000, поэтому после этого все усекается, даже если тип данных столбца равен varchar(max)

Поскольку тип данных varchar(max), поэтому я не хочу, чтобы данные усекались, поэтому попытался установить свойство Установите ANSI_WARNINGS OFF перед вставкой данных в переменную таблицы, но все равно безуспешно.

DECLARE @FormattedMainResult VARCHAR(MAX)

DECLARE @CommonColumns TABLE (FinalColumns VARCHAR(MAX)) 

INSERT INTO @CommonColumns
    SELECT main.AllColumnsMain AS CommonColumns
    FROM [dbo].[Staging] Stg
    INNER JOIN [dbo].[Target] main ON Stg.AllColumnsStg = main.AllColumnsMain

SELECT SUM(LEN(FinalColumns)) AS MaxLen_FinalCommonColumns  
FROM @CommonColumns  -- 7870

SELECT * 
FROM @CommonColumns

Выход:

Final Columns
---------------
John
Carl
Scott
Rick

SELECT @FormattedMainResult = (SELECT DISTINCT 
                                   STUFF((SELECT ',' + 't.' +u.FinalColumns
                                          FROM
                                              (SELECT FinalColumns 
                                               FROM @CommonColumns) u
                                          FOR XML PATH('')), 1, 1, '') AS userlist)  

SELECT SUM(LEN(@FormattedMainResult)) AS MaxLen_posttranspose  -- 8230 so data is truncated
PRINT @FormattedMainResult

выход

t.John,t.Carl,t.Sc

Фактический результат от @FormattedMainResult:

t.John,t.Carl,t.Sc (data truncated)

Ожидаемый результат от @FormattedMainResult:

t.John,t.Carl,t.Scott,....,t.Rick (no truncation)

Обновление

Теперь я столкнулся с проблемой при выполнении оператора Insert into, который я получаю из результата запроса select.

* +1032 * Пример, * 1 033 *
Declare @Result nvarchar(max) 
DECLARE @FormattedStgResult varchar(MAX)
DECLARE  @joinCondition VARCHAR(MAX)='s.Id=t.Id'

SET @Result = ''
SET @Result = 'INSERT INTO ' + QUOTENAME('vjtest') +'.'+ QUOTENAME('dbo') +'.'+ QUOTENAME('Staging') +' (' + @FormattedStgResult + ')  
 SELECT ' + @FormattedMainResult + 
' FROM '+ QUOTENAME('vjtest') +'.'+ QUOTENAME('dbo')+'.'+QUOTENAME('Target') + ' t
 LEFT JOIN '+ QUOTENAME('vjtest') +'.'+QUOTENAME('dbo')+'.'+QUOTENAME('Staging')+ ' s
 ON ' + @joinCondition + 
' WHERE s.UniqueId IS NULL'

Exec(@Result)

@ FormattedMainResult аналогичен старому коду, который будет иметь значения с префиксом «t». -> t.Id, t.Name, 1, ...., t.Rootpid

@ FormattedStgResult имеет тот же результат, что и @FormattedMainResult, только с той разницей, что нет префикса "t". -> Id, Name, IsDelete, ... Rootpid

Это генерирует правильный оператор Insert с ожидаемыми столбцами, но когда он выполняется в Exec (@Result), он говорит, что затронуто 0 строк. Однако, когда тот же самый запрос, который я выполняю вручную, он показывает 3 затронутых строки.

1 Ответ

3 голосов
/ 14 апреля 2019

Комментарий T-SQL в вашем коде доказывает, что фактическая длина переменной составляет 8230 символов. Проблема в том, что PRINT ограничен 8000 символами и усекает лишние символы.

Используйте SELECT @FormattedMainResult; для возврата всего значения, если только оно не было усечено SSMS в соответствии с максимальной длиной столбца в параметре запроса результатов. Сохраняйте ANSI_WARNINGS ON, если только у вас нет устаревшего кода, который требует поведения, отличного от ISO.

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