子查询返回超过 4000 个字符的动态 SQL

Dynamic SQL with Subquery returning more than 4000 characters

我正在尝试创建一个动态查询来检索 table (因为将来可能会添加新列) 并且此查询也可能用于具有不同 table 配置

的多个数据库

现在的目的是比较 OITM table 和 AITM Table

之间的列值是否有任何变化

OITM 包含当前记录 AITM 是一个历史 table 包含历史记录

AITM 和 OITM 列结构始终相同,除了 LogInstanc 列仅存在于 AITM table

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 with (@SQL1 4000 characters + @SQL2 4000 characters + SQL 3 4000 characters) 但我不知道'确切知道如何将此字符串拆分为 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).