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
我正在使用 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