两个SQL查询并将每个查询作为数据集传递以作为参数传递

时间:2011-12-06 15:19:13

标签: sql powershell parameters dataset

我是Powershell的新手,我将以下代码拼凑为一个脚本,该脚本将检查“旧”文件夹并在未找到时创建它。然后,它会将压缩的Web日志从当前位置移动到“旧”文件夹。我希望这个写入从SQL查询中提取服务器名称和网站名称,以便它可以设置为每晚运行,不需要更新新的或删除的服务器。到目前为止我写了以下内容,但由于我是新手,我无法弄清楚最后一点语法。

clear
$SqlServer = "SERVER"
$SqlCatalog = "DATABASE"
$SqlQuery = "select hsa.servername from SERVER.dbo.serversapp hsa
inner join SERVER.dbo.apphosts hah on hsa.vchservername = hah.vchservername
where hsa.tirecordstatus = 1
order by hsa.vchservername desc"
$SqlQuery1 = "select hah.vchhost from SERVER.dbo.serversapp hsa
inner join SERVER.dbo.apphosts hah on hsa.vchservername = hah.vchservername
where hsa.tirecordstatus = 1
order by hsa.vchservername desc"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SqlServer; Database = $SqlCatalog; 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]

我想要做的是让每个$ SQLQuery运行并将每个$ SQLQuery存储在它自己的数据集表中,这样我就可以将每一个作为以下代码的参数传递。我需要弄清楚的是:

1)如何编写上述内容以运行两个SQL查询,并让每个查询都是自己的数据集或表,这样我就可以将它们作为参数; $ Servername和$ HostedGroup?

2)如何设置它以从$ Servername参数递归每个服务器上的以下代码?

$Servername = Dataset1
$Hostedgroup = Dataset2
$OldFolder = "\\$Servername\C$\Ren\Weblogs\$Hostedgroup\old"
$FolderExists = Test-Path $OldFolder


if($FolderExists -eq $False)
{
new-item \\$Servername\C$\Ren\Weblogs\$Hostedgroup\old -type directory
}
then
{
if(Test-Path \\$Servername\C$\Ren\Weblogs\old\W3SVC2)
{
get-childitem -path '\\$Servername\C$\Ren\WebLogs\$Hostedgroup\W3SVC2' -recurse -include *.zip | move-item -destination '\\$Servername\C$\Ren\WebLogs\$Hostedgroup\old'

1 个答案:

答案 0 :(得分:1)

$SqlAdapter.Fill($DataSet)返回一个整数;您应该通过将脚本/函数分配给$null或使用Out-Null来阻止您的脚本/函数返回它。 (例如$null = $SqlAdapter.Fill($DataSet)

对于您的问题的答案,您可以从单个查询返回两个字段,然后迭代结果。模式看起来像这样:

function Get-HostedServerApp {
    $SqlServer = "SERVER"
    $SqlCatalog = "DATABASE"
    $SqlQuery = @"
select hsa.vchappservername, hah.vchhost 
from SERVER.dbo.hostedserversapp hsa
inner join SERVER.dbo.hostedapphosts hah on hsa.vchappservername = hah.vchappservername
where hsa.tirecordstatus = 1
order by hsa.vchappservername desc
"@
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server = $SqlServer; Database = $SqlCatalog; 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
    $null = $SqlAdapter.Fill($DataSet)
    $SqlConnection.Close()
    $Dataset.Tables[0]
}

# Place your logic in this function
function SomeFunction {
    param(
    $Servername,
    $Hostedgroup
    )

    "\\$Servername\C`$\Renaissance\Weblogs\$Hostedgroup\old"
}

$data = Get-HostedServerApp

$data| foreach{SomeFunction -ServerName $_.vchappservername -HostedGroup $_.vchhost}