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

子查询返回超过4000个字符的动态SQL,sql,sql-server,sap,hana,Sql,Sql Server,Sap,Hana,我正在尝试创建一个检索表列的动态查询 因为将来可能会添加新列 此查询也可以用于具有不同表配置的多个数据库 现在的目的是比较OITM表和AITM表之间的列值是否有任何变化 OITM包含当前记录 AITM是包含历史记录的历史表 AITM和OITM列结构始终相同,但LogInstanc列除外,它只存在于AITM表中 DECLARE @ListOfColsValTabDel NVARCHAR(MAX) = '020650005' DECLARE @SQL1 NVARCHAR(MAX) SET @SQL1

我正在尝试创建一个检索表列的动态查询 因为将来可能会添加新列 此查询也可以用于具有不同表配置的多个数据库

现在的目的是比较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个字符

我知道您可以使用@SQL1 4000个字符+SQL2 4000个字符+sql3 4000个字符执行动态SQL,但我不知道如何将此字符串拆分为4000个字符的变量

人们提到的另一种方法是将字符串转换为NVARCHARMAX,但这似乎也没有帮助

有什么建议吗?

打印不会输出更多字符。发件人:

如果消息字符串是一个字符串,则其长度最多可达8000个字符 非Unicode字符串,如果是Unicode,则长度为4000个字符 一串较长的字符串被截断。瓦尔查马克斯酒店 nvarcharmax数据类型被截断为不可用的数据类型 大于varchar8000和nvarchar4000


又名,如果您希望从包含4000/8000个字符的nvarcharMAX获得完整输出,请使用SELECT而不是PRINT。