【发布时间】:2021-06-06 02:12:24
【问题描述】:
我有以下 SQL 查询
DECLARE @table table(dbname sysname)
INSERT INTO @table(dbname)
SELECT NAME FROM sys.databases where name like '%AccountsLive'
DECLARE @Sql NVARCHAR(MAX) = NULL;
SELECT @Sql = COALESCE(@Sql + ' UNION ALL ' + CHAR(13) + CHAR(10), '' ) +
'SELECT ST_ALOC_POINTER, ST_TRANTYPE, ST_HEADER_REF, ST_GROSS , ST_CURRENCYCODE , ST_CURR_VALU , ST_DESCRIPTION FROM '
+ QUOTENAME(dbname) + '.dbo.SL_TRANSACTIONS
WHERE ST_YEAR = ''N''
and ST_PERIODNUMBER = ''1''
and ST_ALOC_POINTER like ''%LC%''
and ST_GROSS <> ''0''
UNION ALL
SELECT ST_ALOC_POINTER, ST_TRANTYPE, ST_HEADER_REF, ST_GROSS , ST_CURRENCYCODE , ST_CURR_VALU , ST_DESCRIPTION FROM '
+ QUOTENAME(dbname) + '.dbo.SL_TRANSACTIONS
WHERE ST_YEAR = ''N''
and ST_PERIODNUMBER = ''1''
and ST_ALOC_POINTER like ''%CR%''
and ST_GROSS <> ''0'''
FROM @table
EXEC( @Sql );
但是,我收到如下隐式转换错误:
无法执行 varchar 值到 varchar 的隐式转换,因为 UNION ALL 运算符中的“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突导致值的排序规则未解决。
有谁知道这是什么或如何解决我的查询?提前致谢!
【问题讨论】:
-
请打印
@sql并发布它以查看生成的查询。 -
整张照片太长了,这里放不下,所以这里只是第一部分:
SELECT ST_ALOC_POINTER, ST_TRANTYPE, ST_HEADER_REF, ST_GROSS , ST_CURRENCYCODE , ST_CURR_VALU , ST_DESCRIPTION FROM [MADAccountsLive].dbo.SL_TRANSACTIONS WHERE ST_YEAR = 'N' and ST_PERIODNUMBER = '1' and ST_ALOC_POINTER like '%LC%' and ST_GROSS <> '0' UNION ALL -
这是简单的 SQL 调试...首先打印 SQL 并将其作为静态 SQL 运行...比动态调试更容易。其次删除所有列并一次加回1,直到发生错误,正确整理导致错误的列...将修复程序放回动态SQL中。这不是我们可以查看和回答的问题,因为我们不知道您的列的排序规则。
-
@DaleK 感谢您的建议,并在下面的帮助下完成了这项工作,现在完美运行!
标签: sql-server tsql dynamic-sql