子查询返回超过 4000 个字符的动态 SQL
Dynamic SQL with Subquery returning more than 4000 characters
我正在尝试创建一个动态查询来检索 table
(因为将来可能会添加新列)
并且此查询也可能用于具有不同 table 配置
的多个数据库
现在的目的是比较 OITM table 和 AITM Table
之间的列值是否有任何变化
OITM 包含当前记录
AITM 是一个历史 table 包含历史记录
AITM 和 OITM 列结构始终相同,除了 LogInstanc 列仅存在于 AITM table
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 个字符
我知道你可以执行动态 SQL with (@SQL1 4000 characters + @SQL2 4000 characters + SQL 3 4000 characters) 但我不知道'确切知道如何将此字符串拆分为 4000 个字符的变量
人们提到的另一种方法是将字符串转换为 NVARCHAR(MAX) 但这似乎也没有帮助。
有什么建议吗?
PRINT
不会输出更多的字符。来自 MSDN:
A message string can be up to 8,000 characters long if it is a
non-Unicode string, and 4,000 characters long if it is a Unicode
string. Longer strings are truncated. The varchar(max) and
nvarchar(max) data types are truncated to data types that are no
larger than varchar(8000) and nvarchar(4000).
我正在尝试创建一个动态查询来检索 table (因为将来可能会添加新列) 并且此查询也可能用于具有不同 table 配置
的多个数据库现在的目的是比较 OITM table 和 AITM Table
之间的列值是否有任何变化OITM 包含当前记录 AITM 是一个历史 table 包含历史记录
AITM 和 OITM 列结构始终相同,除了 LogInstanc 列仅存在于 AITM table
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 个字符
我知道你可以执行动态 SQL with (@SQL1 4000 characters + @SQL2 4000 characters + SQL 3 4000 characters) 但我不知道'确切知道如何将此字符串拆分为 4000 个字符的变量
人们提到的另一种方法是将字符串转换为 NVARCHAR(MAX) 但这似乎也没有帮助。
有什么建议吗?
PRINT
不会输出更多的字符。来自 MSDN:
A message string can be up to 8,000 characters long if it is a non-Unicode string, and 4,000 characters long if it is a Unicode string. Longer strings are truncated. The varchar(max) and nvarchar(max) data types are truncated to data types that are no larger than varchar(8000) and nvarchar(4000).