将powershell脚本输出导出到本地SQLtable

时间:2015-12-03 11:31:00

标签: sql-server csv powershell

我试图将下面脚本的输出直接导出到本地sql表,而不是使用CSV作为中介。有没有办法将以下脚本的输出直接导出到本地sql表。

Get-Content "C:\test\computers.txt" | Where-Object { $_.Trim() -ne "" } |
    ForEach-Object {
        Invoke-Command -Computer $_ -ScriptBlock {

            Param($computer)

            $Database = "secaudit"
            $AttachmentPath = "C:\test\SQLData.csv"
            $SqlQuery = "xp_fixeddrives"

            $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
            $SqlConnection.ConnectionString = "Data Source=$computer;Initial Catalog=$Database;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
            $nRecs = $SqlAdapter.Fill($DataSet)

            $nRecs | Out-Null
            $objTable = $DataSet.Tables[0]
            $DataSet.Tables[0]
        } -ArgumentList $_ -Credential $cred

    } | Select-Object PSComputerName, Drive, "MB Free" |
        Export-Csv -Path "C:\test\output_space.csv" -NoTypeInformation

$query = @"
BULK INSERT [Test1].[dbo].[table_1] FROM "C:\test\output_space.csv" WITH (FIRSTROW = 2, FIELDTERMINATOR = ",", ROWTERMINATOR = "\n")
"@

sqlcmd -S "CSCINDAE680687" -E -Q $query

1 个答案:

答案 0 :(得分:0)

这是一个示例函数,它接受连接字符串,目标表名称和要加载的行的数据表。默认情况下,列按顺序映射,但如果需要,您可以使用SQlBulkCopyColumnMappings指定不同的映射。

Function Insert-TargetTable
{

    param(
          [Parameter(Mandatory=$True)]
            [string]$TargetDatabaseConnectionString
        , [Parameter(Mandatory=$True)]
            [string]$TargetTableName
        , [Parameter(Mandatory=$True)]
            [System.Data.DataTable]$DataTable
    ) 

    $bcp = New-Object System.Data.SqlClient.SqlBulkCopy($TargetDatabaseConnectionString);
    $bcp.DestinationTableName = $TargetTableName;
    $bcp.WriteToServer($DataTable);
    $bcp.Close();

}