带有子查询的动态SQL返回4000多个字符

时间:2018-12-06 10:20:19

标签: sql sql-server sap hana

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

现在的目的是比较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个字符+ SQL 3 4000个字符)执行动态SQL,但是我不知道如何将字符串拆分成4000个字符

人们提到的另一种方法是将字符串强制转换为NVARCHAR(MAX),但这似乎也无济于事。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

PRINT将不会输出更多字符。来自MSDN

  

如果消息字符串是字符串,则最多可以包含8,000个字符。   非Unicode字符串,如果是Unicode,则长度为4,000个字符   串。较长的字符串将被截断。 varchar(max)和   nvarchar(max)数据类型被截断为no   大于varchar(8000)和nvarchar(4000)。