Динамический SQL с подзапросом, возвращающий более 4000 символов

Я пытаюсь создать динамический запрос, который извлекает столбцы таблицы (поскольку в будущем могут быть добавлены новые столбцы) и этот запрос также может использоваться в нескольких базах данных с разными конфигурациями таблиц.

Цель прямо сейчас - сравнить, есть ли какие-либо изменения в значениях столбцов между таблицей OITM и таблицей AITM.

OITM содержит текущую запись AITM - это таблица истории, которая содержит записи истории

Структуры столбцов AITM и OITM всегда одинаковы, за исключением столбца LogInstanc, который существует только в таблице AITM.

DECLARE @ListOfColsValTabDel NVARCHAR(MAX) = '020650005'
DECLARE @SQL1 NVARCHAR(MAX)
SET @SQL1 =  'select COUNT(*) from OITM o 
                        LEFT JOIN AITM a on o."ItemCode" = a."ItemCode" 
                                and a."LogInstanc" = (Select 
                                                         Max(x."Loginstanc") 
                                                            from AITM x 
                                                            where x."ItemCode" =''' + @ListOfColsValTabDel
                                                        +''' 
                                                        )
                        WHERE o."ItemCode" = '''+  @ListOfColsValTabDel
                          + ''' AND (' 

                          -- Below Sub query returns string of 9975 
                          +
                                (select LEFT (REPLACE(stuff((SELECT 'o.'+Name + ' <>  a.'+ Name + ' or ' FROM sys.columns WHERE object_id = OBJECT_ID('dbo.OITM') FOR XML PATH('')), 1, 0, '') , '&lt;&gt;','<>')
                                            ,LEN(REPLACE(stuff((SELECT 'o.'+Name + ' <>  a.'+ Name + ' or ' FROM sys.columns WHERE object_id = OBJECT_ID('dbo.OITM') FOR XML PATH('')), 1, 0, '') , '&lt;&gt;','<>')) - 3)) 
                                +')'




PRINT (@SQL1) -- Gets truncated at 4000 characters
--exec(@SQL1)

Это печатает 4000 символов, в то время как общая строка должна быть около 11000, поскольку подзапрос для извлечения столбцов уже составляет 9975 символов.

Я знаю, что вы можете выполнять динамический SQL с помощью (@ SQL1 4000 символов + @ SQL2 4000 символов + SQL 3 4000 символов), но я точно не знаю, как разбить эту строку на переменные по 4000 символов

Альтернативный метод, о котором упоминается, - это преобразование строки как NVARCHAR (MAX), но это тоже не помогло.

Какие-либо предложения?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PRINT не выводит больше символов. От MSDN:

A message string can be up to 8,000 characters long if it is a non-Unicode string, and 4,000 characters long if it is a Unicode string. Longer strings are truncated. The varchar(max) and nvarchar(max) data types are truncated to data types that are no larger than varchar(8000) and nvarchar(4000).

AKA, если вы хотите получить полный вывод с (n)varchar(MAX), содержащего 4000/8000 символов, используйте SELECT вместо PRINT.

Larnu 06.12.2018 11:30

Другие вопросы по теме