【问题标题】:Error using export-csv in powershell ans SQL Server - Conversion overflow在 powershell 和 SQL Server 中使用 export-csv 时出错 - 转换溢出
【发布时间】:2021-01-16 14:49:55
【问题描述】:

我正在尝试从我不是 adm 的数据库中自动执行 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

FullyQualifiedErrorId : OverflowException

对于葡萄牙语的错误,我很抱歉,但我的电脑是由我公司管理的,所以我无法更改语言。我试着翻译一下:

使用“1”参数调用“填充”的异常:“转换溢出。”

行:29 个字符:5

$SqlAdapter.Fill($DataSet)

CategoryInfo : NotSpecified: (:) [], MethodInvocationException

FullyQualifiedErrorId : OverflowException

我已经能够在没有大数字列或过滤“

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 可以处理的值。任何人都可以帮助/拯救我吗? =)

【问题讨论】:

  • 不幸的是,这似乎是设计使然。 .NET 的十进制结构的最大比例为 28。 SQL 的最大值为 38。

标签: sql-server powershell csv export


【解决方案1】:

作为一种解决方法。

您可以在 SQL 查询中显式指定列名,并使用转换函数将您遇到问题的数字 (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];"
    ...
}

【讨论】:

  • 谢谢你的回答,基里尔。但这不是这种情况下的选择。随着数据库的发展,每天都会删除和创建新表。因此,维护每个表的每一列的映射将是一项巨大的工作。我想知道是否有办法将所有内容导出为 char。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2017-04-14
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多