【发布时间】: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, '') , '<>','<>')
,LEN(REPLACE(stuff((SELECT 'o.'+Name + ' <> a.'+ Name + ' or ' FROM sys.columns WHERE object_id = OBJECT_ID('dbo.OITM') FOR XML PATH('')), 1, 0, '') , '<>','<>')) - 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