【问题标题】:Dynamic SQL with Subquery returning more than 4000 characters带有子查询的动态 SQL 返回超过 4000 个字符
【发布时间】:2018-12-06 10:20:19
【问题描述】:

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

现在的目的是比较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) 但这似乎也没有帮助。

有什么建议吗?

【问题讨论】:

    标签: sql sql-server sap hana


    【解决方案1】:

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

    如果消息字符串是 非 Unicode 字符串,如果是 Unicode,则长度为 4,000 个字符 细绳。较长的字符串被截断。 varchar(max) 和 nvarchar(max) 数据类型被截断为无数据类型 大于 varchar(8000) 和 nvarchar(4000)。

    【讨论】:

    • AKA,如果您想要包含 4000/8000 个字符的 (n)varchar(MAX) 的完整输出,请使用 SELECT 而不是 PRINT
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2013-04-05
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多