我正在尝试创建一个动态查询来检索表的列 (因为将来可能会添加新列) 并且此查询也可能用于具有不同表配置的多个数据库
现在的目的是比较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),但这似乎也无济于事。
有什么建议吗?
答案 0 :(得分:3)
PRINT
将不会输出更多字符。来自MSDN:
如果消息字符串是字符串,则最多可以包含8,000个字符。 非Unicode字符串,如果是Unicode,则长度为4,000个字符 串。较长的字符串将被截断。 varchar(max)和 nvarchar(max)数据类型被截断为no 大于varchar(8000)和nvarchar(4000)。