Динамический SQL с подзапросом, возвращающим более 4000 символов - PullRequest
0 голосов
/ 06 декабря 2018

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

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

Есть предложения?

1 Ответ

0 голосов
/ 06 декабря 2018

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

Строка сообщения может иметь длину до 8000 символов, если она не является строкой Unicode, и 4000 символов, если она является строкой Unicode.Более длинные строки обрезаются.Типы данных varchar (max) и nvarchar (max) усекаются до типов данных, которые не больше, чем varchar (8000) и nvarchar (4000).

...