我有一个名为 tblAccounts 的表,其内容来自 Excel 电子表格。
我在 Windows 8.1 (x64) 上使用 MS SQL Server 2008 (x64)
我尝试使用 SQL Server 导入/导出向导,但没有选择现有表的选项,只有创建新表的选项。
我尝试使用其他方法,例如 OPENROWSETS
INSERT INTO tblAccount SELECT * FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0',
'Excel 12.0;Database=D:\exceloutp.xls','SELECT * FROM [Sheet1$]')
但给了我一个错误:
消息 7308,第 16 级,状态 1,第 1 行 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”不能用于分布式查询,因为该提供程序配置为在单线程单元模式下运行。
一些研究告诉我,这是因为 SQL Server 的 64 位实例而发生的。
问题在于,将 Excel 数据传输到 SQL 表必须仅使用 SQL 导入/导出向导来完成。
如何将 Excel 电子表格导入现有 SQL 表而不创建新表?
我访问过一些链接,但无法帮助我解决问题:
您可以通过以下方式将数据从 Excel 工作表复制粘贴到 SQL 表:
注意:表通常有第一列,它是具有自动生成/递增 ID 的 ID 列。当您粘贴数据时,它将开始将 Excel 中最左边的选定列插入到 SSMS 中最左边的列,从而将数据插入到 ID 列中。为了避免这种情况,请在选择的最左侧保留一个空列,以便在 SSMS 中跳过该列。这将导致 SSMS 插入默认数据,即自动生成的 ID。
此外,您可以通过在 Excel 工作表选择中将空列置于与要跳过的列相同的序号位置来跳过其他列。这将使 SSMS 插入默认值(或 NULL,如果未指定默认值)。
Saudate,我遇到这个问题是为了寻找不同的问题。 您绝对可以使用 Sql Server 导入向导将数据导入到新表中。 当然,您不希望将该表保留在数据库中,因此我的建议是导入一个新表,然后在查询管理器中编写数据脚本以插入到现有表中。 您可以添加一行来删除导入向导创建的临时表,作为成功完成脚本的最后一步。
我相信您最初的问题实际上与 Sql Server 64 位有关,并且是由于您拥有 32 位 Excel 并且这些驱动程序不能很好地协同工作。 当我第一次使用 64 位 excel 时,我确实遇到了一个非常类似的问题。
如果您想要一个软件工具来执行此操作,您可能需要查看此分步指南:
“如何验证 Excel 电子表格并将其导入 SQL Server 数据库”
您也可以运行 Powershell 命令
-- 更改源 ($workbook),并在连接字符串下设置服务器和数据库名称
# Load Excel COM object
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
# Open Excel file
$workbook = $excel.Workbooks.Open("C:\ABC\EmployeeRecords.xlsx")
$sheet = $workbook.Sheets.Item(1)
# Create SQL connection
$connectionString = "Server=MSSQL-ABCD;Database=AWPractDB;Integrated Security=True;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = $connectionString
$sqlConnection.Open()
# Read data from Excel and insert into SQL
$rowIndex = 2
while ($sheet.Cells.Item($rowIndex, 1).Value() -ne $null) {
$firstName = $sheet.Cells.Item($rowIndex, 1).Value()
$lastName = $sheet.Cells.Item($rowIndex, 2).Value()
$department = $sheet.Cells.Item($rowIndex, 3).Value()
$query = "INSERT INTO EmployeeRecords (FirstName, LastName, Department) VALUES ('$firstName', '$lastName', '$department')"
$command = $sqlConnection.CreateCommand()
$command.CommandText = $query
$command.ExecuteNonQuery()
$rowIndex++
}
# Close the Excel and SQL connection
$workbook.Close($false)
$excel.Quit()
$sqlConnection.Close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Write-Output "Data imported successfully"