首页 > 解决方案 > 多数据库查询中的 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 指出这一点!)

标签: sqlsql-servertsql

解决方案


您已重命名该列:

   suname COLLATE Latin1_General_CI_AS as Suppler,  

实际上,您已将所有列重命名为相同的名称。我建议as Suppler从所有列定义中删除。然后order by应该工作。

至于order by去哪里,你可以使用:

set @sql = @sql + ' order by suname';

它在查询结束时进行;在这种情况下,最后一行。


推荐阅读