Sql server 将多个表合并为一个问题的SQL

Sql server 将多个表合并为一个问题的SQL,sql-server,ssms,Sql Server,Ssms,我正在SSMS中运行下面的查询,您可以看到它在不同数据库的多个表中显示结果 如何将这些表合并为一个 我已尝试将UNION和UNION ALL添加到SELECT@Sql=COALESCE@Sql+'UNION'+CHAR13+CHAR10+,但我得到一个无法解决UNION操作中Latin1_General_CI_AS和SQL_Latin1_General_CP1_CI_AS之间的排序规则冲突的结果。错误 任何想法都将不胜感激 DECLARE @table table(dbname sysname

我正在SSMS中运行下面的查询,您可以看到它在不同数据库的多个表中显示结果

如何将这些表合并为一个

我已尝试将UNION和UNION ALL添加到SELECT@Sql=COALESCE@Sql+'UNION'+CHAR13+CHAR10+,但我得到一个无法解决UNION操作中Latin1_General_CI_AS和SQL_Latin1_General_CP1_CI_AS之间的排序规则冲突的结果。错误

任何想法都将不胜感激

DECLARE @table table(dbname sysname COLLATE Latin1_General_CI_AS)

INSERT INTO @table(dbname)
SELECT NAME COLLATE Latin1_General_CI_AS FROM sys.databases where name like '%AccountsLive'

DECLARE @Sql NVARCHAR(MAX) = NULL;

SELECT  @Sql = COALESCE(@Sql + CHAR(13) + CHAR(10), '' ) +
'SELECT c_broker, det_costheader, cuname, ch_name, CONVERT(VARCHAR(11),ch_date_req,103) AS ''Flight_Date'', IIF(OUT.outstanding>0, ''Yes'', ''No'') AS ''Anything_Outstanding?'', sum(c_grossmargin)/2 AS ''Gross_Margin'' FROM ' 
+ QUOTENAME(dbname) COLLATE Latin1_General_CI_AS + '.dbo.AT_ACS_COMMISSIONS AS COM
LEFT JOIN ' + QUOTENAME(dbname) COLLATE Latin1_General_CI_AS + '.dbo.AT_ACS_PROJECTOUTSTANDING AS OUT
ON COM.det_costheader = OUT.project
WHERE c_broker = ''HKGCGOJT''
GROUP BY det_costheader, c_broker, cuname, ch_name, ch_date_req, outstanding'
FROM    @table

exec( @Sql );

如果任何列在不同的数据库中具有不同的排序规则,则需要向其中添加排序规则。我添加了几个来向您展示它是如何完成的

注:

这里不需要table变量 使用字符串_AGG或FOR XML来聚合。 如果要添加参数,请使用sp_executesql并将参数传递给动态零件。不要将参数连接到查询中。 声明@Sql NVARCHARMAX; SET@Sql= 选择 字符串_AGG N'SELECT c_经纪人核对拉丁1_General_CI_AS, det_costheader, cuname校对拉丁语1_General_CI_AS, 邱氏, CONVERTVARCHAR11,航班日期要求,103为[航班日期], IIFOUT.EXTABLE>0,是,否为[任何未完成的内容?], sumc_grossmargin/2 AS[毛利率] 从'+quoteName.name+N'.dbo.AT'u ACS'u作为COM 左连接'+quoteName.name+N'.dbo.AT_ACS_projectas OUT 在COM.det_costheader=OUT.project上 其中c_broker=HKGCGOJT 按数据成本头、c_经纪人、cuname、ch_名称、ch_日期、ch_请求、未完成分组 ', 投下 联合所有 “作为nvarcharmax 从sys.d数据库 其中名称为“%AccountsLive” ; exec@Sql; 如果您使用的是没有字符串_AGG的旧版本SQL Server,则需要使用FOR XML来聚合:

声明@Sql NVARCHARMAX; SET@Sql= 东西 选择 NCHAR10+N'UNION ALL'+NCHAR10+ N'SELECT c_经纪人核对拉丁1_General_CI_AS, det_costheader, cuname校对拉丁语1_General_CI_AS, 邱氏, CONVERTVARCHAR11,航班日期要求,103为[航班日期], IIFOUT.EXTABLE>0,是,否为[任何未完成的内容?], sumc_grossmargin/2 AS[毛利率] 从'+quoteName.name+N'.dbo.AT'u ACS'u作为COM 左连接'+quoteName.name+N'.dbo.AT_ACS_projectas OUT 在COM.det_costheader=OUT.project上 其中c_broker=HKGCGOJT 按数据成本头、c_经纪人、cuname、ch_名称、ch_日期、ch_请求、未完成分组 ' 从sys.d数据库 其中名称为“%AccountsLive” 对于XML路径,键入 .value'text[1],'nvarcharmax',1,11; exec@Sql;
我建议使用PRINT@Sql进行测试,确保生成的SQL实际上是有效的。

将SQL复制到问题的文本中,并在有人帮助您之前对其进行良好的格式化抱歉-我认为图片会更好…我已经编辑了它,现在以文本显示代码。请添加第二个要合并的查询。@KaziMohammadAliNur-没有第二个查询,只有这个查询。当我运行这个查询时,它会根据数据库将结果生成到各个表中。我只想为这个查询生成一个表……这可能吗?将结果插入临时表谢谢@Charlieface的帮助-但是,我得到的字符串\u AGG不是SSMS中可识别的内置函数名?另外,a必须声明scaler变量@SQL…?感谢@Charlieface为此提供的所有帮助,非常感谢…。最后一个问题是希望UNION附近的语法不正确?哎呀,无关;从我复制你的时候开始。用print@SqlYou是我的英雄!谢谢你的帮助!