PowerShell 多个 SQL 查询,不能在每个查询中使用 Order by

PowerShell multiple SQL queries, Cannot use Order by in each query

我正在使用 PowerShell 运行 一个由多个 SELECT DISTINCT 语句组成的 SQL 查询。使用 UNION ALL 将这些结果合并为一个结果。

我想知道是否可以在每个 Select 语句中使用 Order By

我目前有以下内容,仅显示星期一和星期二,但其余几天应该很容易跟进。如果我在最后一个 SELECT 语句中添加 ORDER BY,结果会正确排序,但会脱离 DayOfWeek 排序。

我只是不确定如何使用我找到的任何示例,这些示例使用 () 创建嵌套的 SELECT 语句或 SubQuery。

-edit,忘了说我正在寻找每个 DayOfWeek 查询的 [RebootTime] 列的 OrderBy。

$SQLServer = "ServerNameHere"
$SQLDBName = "DBNameHere"
$SqlQuery = @'
SELECT DISTINCT dbo.server AS [Server], dbo.rack AS [Rack], dbo.Environment AS [Environment], dbo.monday AS [RebootTime], dbo.schedule AS [Schedule]
FROM SomeTable
INNER JOIN SubTable
 ON dbo.Item = dbo.SpecID
WHERE dbo.monday = 1
AND (dbo.Environment = 'Prod' OR  dbo.Environment = 'Cert' OR dbo.Environment = 'Test')
AND (dbo.schedule = 'Weekly' OR dbo.schedule = 'SCCM - Weekly' OR dbo.schedule = 'Monthly' OR dbo.schedule = 'SCCM - Monthly')
AND dbo.Group = 'MyGroup'
AND dbo.object = 'Server'
 UNION ALL
SELECT null, null, null, null, null
 UNION ALL
SELECT 'Tuesday', null, null, null, null
 UNION ALL
SELECT 'Server', 'Rack', 'Environment', 'RebootTime', 'Schedule'
 UNION ALL
SELECT DISTINCT dbo.server AS [Server], dbo.rack AS [Rack], dbo.Environment AS [Environment], dbo.tuesday AS [RebootTime], dbo.schedule AS [Schedule]
WHERE dbo.tuesday = 1
AND (dbo.Environment = 'Prod' OR  dbo.Environment = 'Cert' OR dbo.Environment = 'Test')
AND (dbo.schedule = 'Weekly' OR dbo.schedule = 'SCCM - Weekly' OR dbo.schedule = 'Monthly' OR dbo.schedule = 'SCCM - Monthly')
AND dbo.Group = 'MyGroup'
AND dbo.object = 'Server'
'@
 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
 $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True"
 $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
 $SqlCmd.CommandText = $SqlQuery
 $SqlCmd.Connection = $SqlConnection
 $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
 $SqlAdapter.SelectCommand = $SqlCmd
 $DataSet = New-Object System.Data.DataSet
 $SqlAdapter.Fill($DataSet)
 $SqlConnection.Close()
$DataSet.Tables[0] | Export-Csv -NoTypeInformation -Path D:\Scripts\Output.csv
Invoke-Item -Path d:\Scripts\Output.csv

使用这个

SELECT  Sub.[Server] ,
        Sub.[Rack] ,
        Sub.[Environment] ,
        Sub.[RebootTime] ,
        Sub.[Schedule]
FROM    ( SELECT    t.Pr ,
                    t.RN ,
                    CONVERT(VARCHAR, t.Server) AS [Server] ,
                    CONVERT(VARCHAR, t.Rack) AS [Rack] ,
                    CONVERT(VARCHAR, t.Environment) AS [Environment] ,
                    CONVERT(VARCHAR, t.RebootTime) AS [RebootTime] ,
                    CONVERT(VARCHAR, t.Schedule) AS [Schedule]
          FROM      ( SELECT    1 AS Pr ,
                                ROW_NUMBER() OVER ( ORDER BY dbo.monday ) AS RN ,
                                dbo.server AS [Server] ,
                                dbo.rack AS [Rack] ,
                                dbo.Environment AS [Environment] ,
                                dbo.monday AS [RebootTime] ,
                                dbo.schedule AS [Schedule]
                      FROM      dbo --table
                      WHERE     dbo.monday = 1
                                AND dbo.Environment IN ( 'Prod', 'Cert',
                                                         'Test' )
                                AND dbo.schedule IN ( 'Weekly',
                                                      'SCCM - Weekly',
                                                      'Monthly',
                                                      'SCCM - Monthly' )
                                AND dbo.[Group] = 'MyGroup'
                                AND dbo.[object] = 'Server'
                      UNION ALL
                      SELECT    2 ,
                                0 ,
                                NULL ,
                                NULL ,
                                NULL ,
                                NULL ,
                                NULL
                      UNION ALL
                      SELECT    3 ,
                                0 ,
                                'Tuesday' ,
                                NULL ,
                                NULL ,
                                NULL ,
                                NULL
                      UNION ALL
                      SELECT    4 ,
                                0 ,
                                'Server' ,
                                'Rack' ,
                                'Environment' ,
                                'RebootTime' ,
                                'Schedule'
                      UNION ALL
                      SELECT    5 ,
                                ROW_NUMBER() OVER ( ORDER BY dbo.tuesday ) AS RN ,
                                dbo.server AS [Server] ,
                                dbo.rack AS [Rack] ,
                                dbo.Environment AS [Environment] ,
                                dbo.tuesday AS [RebootTime] ,
                                dbo.schedule AS [Schedule]
                      FROM      dbo --table
                      WHERE     dbo.tuesday = 1
                                AND dbo.Environment IN ( 'Prod', 'Cert',
                                                         'Test' )
                                AND dbo.schedule IN ( 'Weekly',
                                                      'SCCM - Weekly',
                                                      'Monthly',
                                                      'SCCM - Monthly' )
                                AND dbo.[Group] = 'MyGroup'
                                AND dbo.[object] = 'Server'
                    ) t
          UNION ALL
          SELECT    0 ,
                    0 ,
                    'Server' ,
                    'Rack' ,
                    'Environment' ,
                    'RebootTime' ,
                    'Schedule'
        ) AS Sub
ORDER BY Sub.Pr ,
        Sub.RN