SQL错误中的Powershell作业步骤

时间:2015-12-23 17:02:20

标签: sql-server csv powershell sql-job

我是PowerShell的新手,仍然是SQL Server的早期版本,但我正在尝试为SQL代理作业编写PowerShell步骤,该作业查看包含.sql文件名称的CSV文件。

然后它应该查看另一个目录,如果CSV文件中的名称存在于该目录中,它应该打开.sql文件并执行里面的函数。

我收到了一个错误:

  

无法将类型为System.String的对象强制转换为类型System.Type

非常感谢任何帮助。

SELECT IF(fc.counter > 0, fc.counter, 0) counter, b.*, fc.* FROM client_branche cb INNER JOIN branche b On b.id = cb.branche_id LEFT OUTER JOIN (   

    SELECT count(*) as counter, ctn_b.branche_id as b_id
    FROM `historique` h 
    INNER JOIN contenu_branche ctn_b ON ctn_b.contenu_id = h.contenu_id 
    INNER JOIN utilisateur u ON u.id = h.utilisateur_id 
    WHERE h.h_fini = 1 AND ( u.client_id = 1 OR u.client_id = 0 ) AND h.h_dateheure BETWEEN '2015-12-24' AND '2015-12-30'
    group by ctn_b.`branche_id`) 
fc ON fc.b_id = cb.branche_id WHERE cb.client_id = 1

2 个答案:

答案 0 :(得分:1)

如果正确理解了问题,则需要使用Test-Path而不是::exists

$excelFile = "C:/ExcelTest/Test.csv"
$functionDirectory = "some directory"

Import-Csv $excelFile | 
    Foreach-Object {
        $filename = $functionDirectory + '\' + $_[0]
        if (Test-Path $filename) {
            invoke-sqlcmd -inputfile $filename -serverinstance "serverinstance" -database "database"
        }
    }

答案 1 :(得分:0)

我会调整脚本中的一些内容以正确处理CSV,然后使用内置cmdlet来测试给定文件的路径。

[cmdletbinding()]
param()

Import-Module SQLPS -DisableNameChecking
$functionDirectory = "C:\temp\PowerShell_Testing2"
$excelFile = Import-Csv "C:\temp\PowerShell_Testing\SQLFileList.csv"

foreach ($e in $excelFile) {
    $fileonly = Split-Path $e.SQLFile -Leaf
    $fdFile = $functionDirectory + "\" + $fileonly
    if (Test-Path $fdFile) {
        Write-Host "Found File $fdFile"
        Invoke-Sqlcmd -ServerInstance "MANATARMS\SQL12" -InputFile $fdFile -Database master
    }
}

在我的设置中,只有一个文件可以运行:

SELECT TOP 1 name FROM sys.databases

enter image description here

如果您的CSV包含说ServerName,然后是SQLFile,您可以调整脚本以同时提取ServerInstance值:

[cmdletbinding()]
param()

Import-Module SQLPS -DisableNameChecking
$functionDirectory = "C:\temp\PowerShell_Testing2"
$excelFile = Import-Csv "C:\temp\PowerShell_Testing\SQLFileList.csv"

foreach ($e in $excelFile) {
    $fileonly = Split-Path $e.SQLFile -Leaf
    $fdFile = $functionDirectory + "\" + $fileonly
    if (Test-Path $fdFile) {
        Write-Host "Found File $fdFile"
        Invoke-Sqlcmd -ServerInstance $e.ServerName -InputFile $fdFile -Database master
    }
}