sql - 多数据库查询中的 ORDER BY
问题描述
我在 SSMS 中运行以下 SQL 查询,它运行良好。
但是,我想为此添加一个ORDER BY suname
。我知道这意味着要在UNION ALL
标准查询的末尾进行,但是当一次在多个数据库上运行查询时,我不确定将其放在哪里。
DECLARE @Sql NVARCHAR(MAX);
SET @Sql =
STUFF(
(SELECT
NCHAR(10) + N'UNION ALL' + NCHAR(10) +
N'SELECT
LEFT('+ QUOTENAME(d.name, '''') + N', LEN('+ QUOTENAME(d.name, '''') + N') - 12) AS Office,
pt_copysupp COLLATE Latin1_General_CI_AS as Supplier_Code,
suname COLLATE Latin1_General_CI_AS as Supplier_Name,
pt_trantype COLLATE Latin1_General_CI_AS as Tran_Type,
pt_gross as Local_Gross,
pt_currencycode COLLATE Latin1_General_CI_AS as Foreign_Currency_Code,
pt_curr_valu as Foreign_Currency_Gross
FROM ' + QUOTENAME(d.name) + '.dbo.pl_transactions
inner join ' + QUOTENAME(d.name) + '.dbo.pl_accounts on ' + QUOTENAME(d.name) + '.dbo.pl_transactions.pt_copysupp = ' + QUOTENAME(d.name) + '.dbo.pl_accounts.sucode
where pt_trantype in (''INV'', ''CRN'')
and pt_date between ''2020-01-01'' and ''2020-12-31'''
FROM sys.databases d
WHERE name LIKE '%AccountsLive'
FOR XML PATH(''), TYPE)
.value('text()[1]','nvarchar(max)'), 1, 11, '');
EXEC (@Sql);
如果我像往常一样把它放在查询的末尾,如下所示,我得到一个错误
UNION 附近的语法不正确
并且运行打印调试当然会将这个顺序放在每个数据库查询的末尾,这是不正确的,因为这只是像通常的查询一样在查询的末尾出现一次ORDER BY
。
and pt_date between ''2020-01-01'' and ''2020-12-31''
order by SUNAME'
有什么建议么?谢谢!
编辑:我已经更改了以前不正确的列名(感谢@Gordan Linoff 指出这一点!)
解决方案
您已重命名该列:
suname COLLATE Latin1_General_CI_AS as Suppler,
实际上,您已将所有列重命名为相同的名称。我建议as Suppler
从所有列定义中删除。然后order by
应该工作。
至于order by
去哪里,你可以使用:
set @sql = @sql + ' order by suname';
它在查询结束时进行;在这种情况下,最后一行。
推荐阅读
- python - Python:修复无效的 json 字符串
- tfs - 本地 TFS/Azure DevOps 是否与 okta 集成以实现 SSO?
- button - Flutter:如何使按钮不可见但处于活动状态,以便您只能看到文本?
- flutter - 如何通过在 Flutter 中调用 Future 来加载更多项目并在 Listview 构建器中显示
- javascript - 在 three.js 中加载网格
- c# - Dotnet CORE 3.1 - 访问关联项目库中的嵌入式资源(文件)
- android - 打算从 Android 的通话记录中选择电话号码
- javascript - 我可以在没有后端的情况下使用谷歌驱动第三方授权吗
- java - Eclipse 无法识别 jar 的源代码文件
- python - 使用 Tkinter Treeview 显示 csv 文件中的前 10 条记录