У меня есть табличная переменная со столбцом типа 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 затронутых строки.