【问题标题】:Getting an error when importing Excel file to SQL server database将 Excel 文件导入 SQL Server 数据库时出错
【发布时间】:2017-10-30 16:03:53
【问题描述】:

我想将一个 Excel 文件导入我的 SQL 服务器数据库。下面是我的代码:

$dir = "\\server\files\"
$latest = Get-ChildItem -Path $dir |
          Where-Object {$_.name -like "*Data Action source *"} |
          Sort-Object LastWriteTime -Descending |
          Select-Object -First 1
Write-Output "The latest file is: $latest"
Write-SqlTableData -ServerInstance "instance1" -DatabaseName "db1" -SchemaName dbo -TableName Table1 -InputData $latest -Force
Write-Output "The latest file is $latest. Let's start the import"

代码很好地选择了最新的文件,但是在插入数据库时​​失败并出现以下错误:

Write-SqlTableData:未找到 .Net 类型“System.IO.DirectoryInfo”和“Directory”列的 SQL 类型之间的映射。考虑删除该类型的列并重复操作

【问题讨论】:

  • -InputData $latest -> -InputData $latest.FullName?
  • 嗨 Ansgar,我试过你的方法,是的,它有效,但现在表格有奇怪的内容,即我不知道它们来自哪里的列见下文:长度字符

标签: sql-server powershell import


【解决方案1】:

来自错误:变量$latest 的类型为System.IO.DirectoryInfo,这不是Write-SqlTableData 命令的-InputData 参数所期望的。

在控制台中运行此行以获得文档:

Get-Help Write-SqlTableData -Full

在那里,您将看到-InputData 的条目

-InputData <PSObject>
    Specifies the data to write to the database.

    Typical input data is a System.Data.DataTable, but you can specify System.Data.DataSet or
    System.Data.DateRow objects.

    Required?                    true
    Position?                    named
    Default value                none
    Accept pipeline input?       true (ByValue)
    Accept wildcard characters?  false

所以解决办法就是把csv转换成这个命令可以理解的格式。第一步是将数据实际导入 PowerShell,因为您所拥有的只是文件信息(路径、大小等)

下面,我将 CSV 转换为 psobject 数据类型。这可能仍然会给您一个错误。对于转换为将被接受的System.Data.Datablecheck out this link

dir = "\\server\files\"
$latest = Get-ChildItem -Path $dir |
          Where-Object {$_.name -like "*Data Action source *"} |
          Sort-Object LastWriteTime -Descending |
          Select-Object -First 1
Write-Output "The latest file is: $latest"

# Import CSV to get the data
$csvData = Import-csv $latest.FullName

# Convert to psobject. This may still be rejected; I can't test. If it is, convert to DataTable.
$thingToImport = [psobject]$csvData

Write-SqlTableData -ServerInstance "instance1" -DatabaseName "db1" -SchemaName dbo -TableName Table1 -InputData $thingToImport -Force
Write-Output "The latest file is $latest. Let's start the import"

【讨论】:

  • 您好,gms,正在导入的文件是 excel 文件,而不是 csv。不确定我是否应该按照您上面所说的相同流程进行操作。请澄清一下?
  • 以上不适用于xls/xlsx文件; Import-Csv 函数将失败。您可以使用 Excel 以编程方式执行此操作,但会有几个步骤。是否可以预先将文件另存为csv
  • 保存为 cv 可能不是一个选项,因为导入过程将在未来自动化。我尝试使用上面的方法使用 Excel 文件,但遇到了我不知道如何修复的错误:即 Write-SqlTableData:给定的 ColumnMapping 与源或目标中的任何列都不匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多