无法在 32 位环境中加载程序集 MICROSOFT.SQLSERVER.BATCHPARSER

Could Not Load Assembly MICROSOFT.SQLSERVER.BATCHPARSER on 32-BIT environment

我在这里发布我的问题,希望有人能帮助我解决问题。

因此,我为我的一个客户开发了一个 PS 脚本,该脚本检索数据库的 table 并将其作为 CSV 直接导出到 Blob 存储。我的脚本在 64 位环境中运行良好。但是,我无法在 32 位环境中 运行 它。我需要在 32 位环境中 运行 它,因为客户端使用的调度程序是 32 位工具。 在我这边,我已经尝试了我在网上找到的关于这个主题的所有东西,但没有成功。

我上面所说的问题是我无法在 32 位环境中 运行 我的脚本。我放了一张展位环境的截图,这样你就可以看到我有什么了。

绿色方块是预期的结果。黄色的是我遇到的错误。 蓝色方块显示我下载的 SqlServer 模块 (x86 & 64)。

我在 CMD SHELL 中有相同的行为。

所以我的问题是: 有没有办法让这个脚本在 32 位环境中工作? 否则有没有强制 32 位 CMD SHELL 在 PowerShell 上打开 64 位会话?

这是完整的 PS 脚本:

param (
    [String]$SourceServer="" ,
    [String]$SourceDatabase="" ,


    [String]$DestinationStorageAccountName = "",
    [String]$DestinationStorageAccountContainrerName= "",

    [String]$DBUser = "",
    [String]$DBUserPWD = ""
)

FUNCTION Write-ToBlobStorage{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)][String]$ResultString,
        [Parameter(Mandatory)][String]$DestinationStorageAccountName,
        [Parameter(Mandatory)][String]$DestinationStorageAccountContainrerName,
        [Parameter(Mandatory)][String]$FileName
    )

    write-host "Clear existing identies to keep cache fresh"
    Clear-AzContext -force

    write-host "Authenticate using the Managed identity"
    $account = Connect-AzAccount -identity
    if(-not $account.Context.Subscription.Id)
    {
        write-error "Failed to authenticate with the Managed identity. Ensure VM has a Managed identity enabled and is assigned the correct IAM roles"
        return
    }

    write-host "Get storage context"
    $context = New-AZStorageContext  -StorageAccountName $DestinationStorageAccountName

    write-host "Get storage Container"
    $container=Get-AzStorageContainer -Name $DestinationStorageAccountContainrerName -Context $context

    write-host "Writing Result to storage"
    $content = [system.Text.Encoding]::UTF8.GetBytes($ResultString)

    $container.CloudBlobContainer.GetBlockBlobReference("$FileName.csv").UploadFromByteArray($content,0,$content.Length)

}


#Import-Module 'Az.KeyVault' -Force
#Import-Module -Name 'C:\Program Files\WindowsPowerShell\Modules\SqlServer' -Force
Import-Module -Name 'C:\Program Files (x86)\WindowsPowerShell\Modules\SqlServer' -Force


$TLS12Protocol = [System.Net.SecurityProtocolType] 'Ssl3 , Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $TLS12Protocol


$Query = "SELECT @@SERVERNAME"

$Result = Invoke-Sqlcmd -ServerInstance $SourceServer -Database $SourceDatabase -Query $Query | ConvertTo-Csv -Delimiter '|' -NoTypeInformation

$ResultString = $Result -join "`r`n" 

Write-ToBlobStorage -ResultString $ResultString -DestinationStorageAccountName $DestinationStorageAccountName -DestinationStorageAccountContainrerName $DestinationStorageAccountContainrerName -FileName "TMP_Flux"

write-host "--- ALL DONE---"

这是 32 位的错误:

Invoke-Sqlcmd : Could not load file or assembly 
'Microsoft.SqlServer.BatchParser, Version=15.100.0.0, Culture=neutral, 
PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot 
find the file specified.
At C:\temp\ExportToBlobScript\ExportToBlob.ps1:87 char:11
+ $Result = Invoke-Sqlcmd -ServerInstance $SourceServer -Database $Sour ...
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Invoke-Sqlcmd], FileNotFoundEx 
   ception
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.SqlServ 
   er.Management.PowerShell.GetScriptCommand
 
Write-ToBlobStorage : Cannot bind argument to parameter 'ResultString' because 
it is an empty string.
At C:\temp\ExportToBlobScript\ExportToBlob.ps1:91 char:35
+ Write-ToBlobStorage -ResultString $ResultString -DestinationStorageAc ...
+                                   ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Write-ToBlobStorage], Parameter 
   BindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAll 
   owed,Write-ToBlobStorage
 
--- ALL DONE---

这是 64 位的结果:

Clear existing identies to keep cache fresh
Authenticate using the Managed identity
Get storage context
Get storage Container
Writing Result to storage
--- ALL DONE---

非常感谢大家的建议。

不确定。但是由于您只使用 Invoke-SqlCmd 到 运行 查询,您可以通过直接从 PowerShell 使用 ADO.NET 来消除对 SqlServer powershell 模块的依赖。 SQL 服务器客户端库是 .NET 框架的一部分,因此它们将在任何 Windows 机器上可用。所以像:

function Invoke-SqlCmd-Custom{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)][String]$ServerInstance,
        [Parameter(Mandatory)][String]$Database,
        [Parameter(Mandatory)][String]$Query 
    )

    $con = new-object System.Data.SqlClient.SqlConnection
    $con.ConnectionString = "Server=$ServerInstance;Database=$Database;Integrated Security=true"
    try
    {
        $con.Open()
        $cmd = $con.CreateCommand()
        $cmd.CommandText = $Query 
        $dt = new-object System.Data.DataTable
        $rdr = $cmd.ExecuteReader()
        $dt.Load($rdr)
        return $dt.Rows
    }
    finally
    {
      $con.Close()
    }

}