Я пытаюсь создать динамический запрос, который извлекает столбцы таблицы (поскольку в будущем могут быть добавлены новые столбцы) и этот запрос также может использоваться в нескольких базах данных с разными конфигурациями таблиц.
Цель прямо сейчас - сравнить, есть ли какие-либо изменения в значениях столбцов между таблицей 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, '') , '<>','<>')
,LEN(REPLACE(stuff((SELECT 'o.'+Name + ' <> a.'+ Name + ' or ' FROM sys.columns WHERE object_id = OBJECT_ID('dbo.OITM') FOR XML PATH('')), 1, 0, '') , '<>','<>')) - 3))
+')'
PRINT (@SQL1) -- Gets truncated at 4000 characters
--exec(@SQL1)
Это печатает 4000 символов, в то время как общая строка должна быть около 11000, поскольку подзапрос для извлечения столбцов уже составляет 9975 символов.
Я знаю, что вы можете выполнять динамический SQL с помощью (@ SQL1 4000 символов + @ SQL2 4000 символов + SQL 3 4000 символов), но я точно не знаю, как разбить эту строку на переменные по 4000 символов
Альтернативный метод, о котором упоминается, - это преобразование строки как NVARCHAR (MAX), но это тоже не помогло.
Какие-либо предложения?


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.