首页 > 解决方案 > 使用 PowerShell 在 SQL Server 表中加载 URL 结果

问题描述

我有一个 PowerShell 脚本,它通过使用以下方法直接在 Web 上查询并将输出保存到 HTML 文件中,为所有版本的 SQL Server 提供最新的 SP 和 CU。

Invoke-WebRequest -UseBasicParsing -Uri $URI

我希望在 SQL Server 表中得到相同的结果,但我无法这样做。请帮助我了解如何实现这一目标。

下面是完整的代码:

注意:您可以直接执行此脚本。

-------------------------------------------------- -------------------------------------------------- -

# Script to display all SQL Server Service Packs per version available on microsoft technet

$URI = "https://docs.microsoft.com/en-us/sql/database-engine/install-windows/latest-updates-for-microsoft-sql-server?view=sql-server-ver15"
$WebResponse = Invoke-WebRequest -UseBasicParsing -Uri $URI
# $WebResponse
# -----------------------------------------------------------------------------------------------------
# ------------------------------------------------- 
# Format the Output 
# -------------------------------------------------
 $content = $WebResponse.RawContent -replace "\s*`n", " " 
 $Tab=$content -match "<table(.*)</table>"
 $Output=$matches[0]
 while ($Output.Contains("  ")){
    $Output = $Output -replace "  "," "
 }
 $Output= $Output.replace('class="grid"','id="grid"').replace("<td> <strong>","<th>").replace("</strong> </td>","</th>")
$OutputFile=".\SQLServer-Latest-SP-CU.html"
 $PageTableHeader | out-file $OutputFile -encoding default
 out-file $OutputFile -encoding default -Append
 $Output | out-file $OutputFile -encoding default -Append
 out-file $OutputFile -encoding default -Append
 Write-Host "Output written to $OutputFile"
 start $OutputFile

标签: sql-serverpowershellpowershell-4.0

解决方案


由于您的 html 格式正确,您可以使用 T-SQL 中的 XML 方法来解析并插入到表中。下面的示例使用 html 获取现有的 $Output 字符串并将其作为 XML 参数传递。

$sql = @"
CREATE TABLE dbo.SqlPatches(
      ProductVersion varchar(30)
    , LatestServicePack varchar(30)
    , LatestCumulativeUpdate varchar(30)
    , GeneralGuidance varchar(30)
);

INSERT INTO dbo.SqlPatches
SELECT 
      b.value('./td[1]','varchar(100)') AS ProductVersion
    , b.value('./td[2]','varchar(100)') AS LatestServicePack
    , b.value('./td[2]','varchar(100)') AS LatestCumulativeUpdate
    , b.value('./td[2]','varchar(100)') AS GeneralGuidance
FROM @SqlPatches.nodes('/table/tbody/tr') AS a(b);
"@

$connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=tempdb;Integrated Security=SSPI")
$command = New-Object System.Data.SqlClient.SqlCommand($sql, $connection)
$command.Parameters.Add("@SqlPatches", [System.Data.SqlDbType]::Xml).Value = $Output
$connection.Open()
[void]$command.ExecuteNonQuery()
$connection.Close()

推荐阅读