【问题标题】:Need help adding values to list需要帮助将值添加到列表
【发布时间】: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 个表:teacherclassroomstudent DatabaseC 在架构 fact 中有 100 个表,其中两个名称为卡车:privatetruckcompanytruck

我想要的是创建一个包含以下内容的数据集(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


【解决方案1】:

其实是通过SQL传递列表的方式解决的。我对 SQL 非常熟悉。这样我就不需要在 Powershell 中构建复杂性:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多