【发布时间】:2021-06-22 01:00:36
【问题描述】:
我有一个名为 confiog.datalist 的表,如下所示:
DBNAME | SCHEMANAME | TABLENAME | order
DatabaseA | staging | customers | 1
DatabaseB | conversion | * | 2
DatabaseC | fact | *truck | 3
两个数据库位于同一台服务器上。
DatabaseB 在架构 conversion 中有 3 个表:teacher、classroom、student
DatabaseC 在架构 fact 中有 100 个表,其中两个名称为卡车:privatetruck、companytruck
我想要的是创建一个包含以下内容的数据集(Powershell)
SELECT * FROM DatabaseA.staging.customer
SELECT * FROM DatabaseB.staging.teacher
SELECT * FROM DatabaseB.staging.classroom
SELECT * FROM DatabaseB.staging.student
SELECT * FROM DatabaseC.fact.privatetruck
SELECT * FROM DatabaseC.fact.companytruck
我将遍历这个数据集来执行这些查询。
我确实知道如何获取 SELECT * FROM DatabaseA.staging.customer 并将其放入数据集中。
我确实知道如何获取所有 other SELECT statements,但我不知道如何将所有这些语句添加到同一个数据集 ($FinalList)...
在我到目前为止的代码下方。这里唯一的问题是我不知道如何创建 #FinalList 并向其中添加记录...关于在 $FinalList 中执行查询的部分已经完成。
# Get variables
$dataSource = $args[0]
$database = $args[1]
$destinationfolder = $args[2]
#Create Connection
$auth = "Integrated Security=SSPI;"
$connectionString = "Provider=sqloledb; " + "Data Source=$dataSource; " + "Initial Catalog=$database; " +"$auth; "
$connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
#Read [config].[datalist] and insert in $tblDataList, fill $rowsInDatalist
$sql = "SELECT
row_number() OVER(ORDER BY [ORDER]) as [Order]
,replace(replace([tablename],'[',''),']','') AS TableName_Org
,replace(replace([dbname],'[',''),']','') AS DBName
,replace(replace([schemaname],'[',''),']','') AS SchemaName
,replace(replace([tablename],'[',''),']','') AS TableName
,replace(replace(replace([tablename],'[',''),']',''),'*','ALL_'+upper(replace(replace([schemaname],'[',''),']',''))) as [FileName]
, 'SELECT * FROM ' + quotename(replace(replace([dbname],'[',''),']',''))+'.'+
quotename(replace(replace([schemaname],'[',''),']',''))+'.'+
quotename(replace(replace([tablename],'[',''),']','')) AS SelectQuery
from [config].[datalist]
order by [order]"
$command = New-Object System.Data.OleDb.OleDbCommand $sql,$connection
$connection.Open()
$adapter = New-Object System.Data.OleDb.OleDbDataAdapter $command
$tblDataList = New-Object System.Data.DataSet
[void] $adapter.Fill($tblDataList)
$connection.Close()
$rowsInDatalist=($tblDataList.Tables | Select-Object -Expand Rows)
#start looping through the results of the list I got
$i=0
foreach ($row in $rowsInDatalist)
{
# I guess I should create the object here to fill it with results? This object could be called $FinalList
if(-NOT $row.TableName_Org[$i] -match "\`*") # checking if there is a wildcard in the tablename
{
#excute following query and add results to $FinalList:
$sql = "SELECT 'SELECT * FROM ' + quotename(replace(replace(s.name,'[',''),']',''))+'.'+quotename(replace(replace(t.name,'[',''),']','')) as SelectFullSchema
FROM sys.schemas s
INNER JOIN sys.tables t on s.schema_id = t.schema_id
WHERE s.name like '%' "+ $row.SchemaName[$i] + "'%' and t.name like '%' "+ $row.TableName[$i] + "'%'"
}
else {
# get $row.SelectQuery[$i] and add results to $FinalList:
}
#execute all queries from $FinalList
$i++
}
【问题讨论】:
-
UNION ALL?但这仅在列相同的情况下才有效。如果列不同,则无法合并查询。 -
这是个主意!
-
其实是通过SQL传递列表的方式解决的。我对 SQL 非常熟悉。这样我就不需要在 Powershell 中构建复杂性:)
标签: sql-server powershell