使用 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()
我有一个 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()