使用 PowerShell 加载 URL 导致 SQL 服务器 table

Loading URL result in SQL Server table with PowerShell

我有一个 PowerShell 脚本,它通过使用以下方法直接在 Web 上查询并将输出保存到 HTML 文件。

Invoke-WebRequest -UseBasicParsing -Uri $URI

我想在 SQL 服务器 table 中得到相同的结果,但我做不到。请帮助我了解如何实现这一目标。

完整代码如下:

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

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

# 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

由于您的 html 格式正确,您可以使用 T-SQL 中的 XML 方法来解析并插入到 table 中。下面的示例采用带有 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()