簡體   English   中英

在 powershell ans SQL Server 中使用 export-csv 時出錯 - 轉換溢出

[英]Error using export-csv in powershell ans SQL Server - Conversion overflow

我正在嘗試從數據庫自動執行 csv 備份,我不是管理員。 所以我無法使用 SQL Server 處理的大部分工具。 我能夠使用的解決方案是以下 powershell 代碼。 除了一個具有巨大數字(38 個位置)字段的特定表格外,它運行得非常完美。

當我嘗試使用包含該字段的 export-csv 時,它返回以下錯誤:

Exceção ao chamar "Fill" com "1" argumento(s): "Estouros de conversão."

沒有 linha:29 字符:5

$SqlAdapter.Fill($DataSet)

CategoryInfo : NotSpecified: (:) [], MethodInvocationException

FullQualifiedErrorId : 溢出異常

我很抱歉葡萄牙語的錯誤,但我的電腦是由我公司管理的,所以我無法更改語言。 我會試着翻譯它:

使用“1”參數調用“Fill”的異常:“轉換溢出”。

行:29 字符:5

$SqlAdapter.Fill($DataSet)

CategoryInfo : NotSpecified: (:) [], MethodInvocationException

FullQualifiedErrorId : 溢出異常

我已經能夠在沒有大數字列或過濾“< 999999999999999999999999999999”之類的字段的情況下導出它。 列的類型是 NUMERIC(38,0),下面是一些導致錯誤的值的示例。

9332003150820027276792001711182003

143295882003819000120030011493142

1411110005678200117658820118210141

1205000040601104009022001104009396

#Variables
$SQLServer = "myserver"
$SQLDBName = "myDB"
$SQLSchema = "Schema"
$delimiter = "¬"
$encoding = "UTF8"
$UseQuotes = "Always"
$tabelas = @("myTable")

#Conexão SQL
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True;"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection

foreach ($tab in $tabelas) {
    #Comandos SQL
    $SqlQuery = "SELECT * from [$SQLDBName].[$SQLSchema].[$tab];"
    $SqlCmd.CommandText = $SqlQuery
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $SqlAdapter.SelectCommand.CommandTimeout = 2400;

    #Exporta dados
    $hour = Get-Date -Format HH:mm:ss
    "Começou o export da tabela $tab às $hour"
    Get-Date -Format HH:mm:ss
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    $DataSet.Tables[0] | export-csv -Delimiter $delimiter -Encoding $encoding -Path "C:\exports\$SQLSchema.$tab.csv" -NoTypeInformation
    $hour = Get-Date -Format HH:mm:ss
    "Terminou o export da tabela $tab às $hour"
}

我的猜測是該過程正在嘗試將列轉換為數字並且該值大於 powershell 可以處理的值。 有人可以幫助/拯救我嗎? =)

作為一種解決方法。

您可以在 SQL 查詢中明確指定列名,並通過使用 convert 函數將您遇到問題的那個 numeric(38,0) 列的數據類型更改為 varchar,這樣您就可以將該數字存儲為字符串數據類型的值。

$SqlQuery = "SELECT col1,col2,convert(nvarchar(38),col3) as col3 from [$SQLDBName].[$SQLSchema].[$tab];"

通過這種方式,您還可以根據表名添加條件列集,以防您有多個表。 像這樣:

首先,您要通過哈希表類型的變量聲明條件映射,表名及其相關列名以及其他可能的特定事物。

$HashTable = @{
    TableName111 = 'col1';
    TableName222 = 'col1,col2,convert(varchar(38),col3)';
    TableName333 = 'col1,*';
}

然后您將 HashTable 值添加到 foreach 循環以創建自己的 SQL 查詢,並為每個表設置特定的列或使用默認模式。

foreach ($tab in $tabelas) {
    #Comandos SQL
    $SqlColumns = if($HashTable[$tab]){$HashTable[$tab]}else{'*'}
    $SqlQuery = "SELECT $SqlColumns from [$SQLDBName].[$SQLSchema].[$tab];"
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM