我有下面的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运算符中的"SQL_Latin1_General_CP1_CI_AS“和"Latin1_General_CI_AS”之间的排序冲突未解决。
有人知道这是什么或者如何修复我的查询吗?提前感谢!
发布于 2021-03-08 07:53:28
该错误涉及表和sys.databases表上的不同排序规则,您应该在select语句中使用显式排序规则(问题是dbname),只需更改这一行:
SELECT NAME COLLATE Latin1_General_CI_AS FROM sys.databases where name like '%AccountsLive'并将您的@table更改为:
DECLARE @table table(dbname sysname COLLATE Latin1_General_CI_AS)如果不能解决问题,请也使用以下方法:
... QUOTENAME(dbname) COLLATE Latin1_General_CI_AS ... 发布于 2021-03-08 07:48:22
当我们将UNION跨多个数据库时,我们将得到排序规则错误,因为数据库表中的列之间存在排序规则冲突。
为了避免这种情况,我们可以修改查询,如下所示,针对有问题的特定列。
我们不需要对每个专栏都这么做。但是,由于我不知道哪一列有此问题,我将把所有的列放在查询中。
SELECT @Sql = COALESCE(@Sql + ' UNION ALL ' + CHAR(13) + CHAR(10), '' ) +
'SELECT ST_ALOC_POINTER COLLATE DATABASE_DEFAULT, ST_TRANTYPE COLLATE DATABASE_DEFAULT,
ST_HEADER_REF COLLATE DATABASE_DEFAULT, ST_GROSS COLLATE DATABASE_DEFAULT,
ST_CURRENCYCODE COLLATE DATABASE_DEFAULT, ST_CURR_VALU COLLATE DATABASE_DEFAULT,
ST_DESCRIPTION COLLATE DATABASE_DEFAULT FROM '
+ QUOTENAME(dbname) + '.dbo.SL_TRANSACTIONShttps://stackoverflow.com/questions/66525713
复制相似问题