Я пытаюсь создать динамический запрос, который извлекает столбцы таблицы (поскольку новые столбцы могут быть добавлены в будущем), и этот запрос также может использоваться в нескольких базах данных с различными конфигурациями таблиц
Сейчас цель состоит в том, чтобы сравнить, есть ли какие-либо изменения в значениях столбцов между таблицей 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), но это, похоже, тоже не помогло.
Есть предложения?