使用 RODBC 的 MS-SQL 批量插入

发布于 2024-08-04 11:47:58 字数 149 浏览 8 评论 0原文

是否可以使用 RODBC 包向 MS-SQL Server(2000、2005、2008)执行批量插入?

我知道我可以使用 freebcp 来做到这一点,但我很好奇 RODBC 包是否实现了 Microsoft SQL API 的这一部分,如果没有,实现它会有多困难。

Is it possible to perform a bulk insert into an MS-SQL Server (2000, 2005, 2008) using the RODBC package?

I know that I can do this using freebcp, but I'm curious if the RODBC package implements this portion of the Microsoft SQL API and if not, how difficult it would be to implement it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

绿萝 2024-08-11 11:47:58

查看新的 odbcDBI 软件包。 DBI::dbWriteTable 每秒写入大约 20,000 条记录...比 RODBC::sqlSave() 中的行插入快得多

check out the new odbc and DBI packages. DBI::dbWriteTable writes around 20,000 records per second... Much much faster than the Row Inserts from RODBC::sqlSave()

一个人练习一个人 2024-08-11 11:47:58

You're probably looking for ?sqlSave which uses a parametrized INSERT INTO query (taking place in one operation) when you set Fast=True.

久随 2024-08-11 11:47:58

现在您可以使用新的 rsqlserver 包中的 dbBulkCopy

典型场景

  1. :创建一个矩阵,
  2. 将其保存为 csv 文件
  3. 您调用 dbBulkCopy 来读取 fil 并使用 MS Sql 服务器内部的 bcp 工具插入它。

假设您的表已在数据库中创建:

dat <- matrix(round(rnorm(nrow*ncol),nrow,ncol)
id.file = "temp_file.csv"                      
write.csv(dat,file=id.file,row.names=FALSE)
dbBulkCopy(conn,'NEW_BP_TABLE',value=id.file)

Now You can use dbBulkCopy from the new rsqlserver package:

A typical scenario:

  1. You create a matrix
  2. you save it as a csv file
  3. You call dbBulkCopy to read fil and insert it using internally bcp tool of MS Sql server.

This assume that your table is already created in the data base:

dat <- matrix(round(rnorm(nrow*ncol),nrow,ncol)
id.file = "temp_file.csv"                      
write.csv(dat,file=id.file,row.names=FALSE)
dbBulkCopy(conn,'NEW_BP_TABLE',value=id.file)
〃安静 2024-08-11 11:47:58

使用 RODBC,我们能够创建的最快插入(2.6 亿行插入)如下所示(以 R 伪代码表示):

ourDataFrame <- sqlQuery(OurConnection, "SELECT myDataThing1, myDataThing2
                                         FROM myData")
ourDF <- doStuff(ourDataFrame)
write.csv(ourDF,ourFile)  
sqlQuery(OurConnection, "CREATE TABLE myTable ( la [La], laLa [LaLa]);
                         BULK INSERT myTable FROM 'ourFile' 
                              WITH YOURPARAMS=yourParams;")

如果您在服务器之间运行此操作,则需要 R 服务器可以使用的网络驱动器写入(例如,一台有权写入数据库的服务器使用 Rscript 来生产代码),并且 SQL Server 可以从中读取。

Using RODBC, the fastest insert we've been able to create (260 million row insert) looks like the following (in R pseudo code):

ourDataFrame <- sqlQuery(OurConnection, "SELECT myDataThing1, myDataThing2
                                         FROM myData")
ourDF <- doStuff(ourDataFrame)
write.csv(ourDF,ourFile)  
sqlQuery(OurConnection, "CREATE TABLE myTable ( la [La], laLa [LaLa]);
                         BULK INSERT myTable FROM 'ourFile' 
                              WITH YOURPARAMS=yourParams;")

If you're running this from between servers, you need a network drive that the R server can write to (e.g. one server with permissions for writing to the DB uses Rscript to productionalize the code), and the SQL Server can read from.

帝王念 2024-08-11 11:47:58

从我能找到的所有信息来看,没有批量插入 MySQL 的解决方案,也没有任何可以与 SSIS 配合使用的解决方案,这就是 Microsoft 在购买 Revolution R Analytics 后在 SQL Server 2016 中包含数据库内分析的原因。

我试图对之前的答案发表评论,但没有这样做的声誉。

rsqlserver 包需要与 rClr 一起运行,但这两个包都表现不佳,特别是因为 rsqlserver 的 INSERT 函数的数据类型很差处理。因此,如果您使用它,您将不知道您在 SQL 表中查看的内容,因为 data.frame 中的大部分信息都已被转换。

考虑到 RODBC 包已经存在了 15 年,我对没有人创建批量插入功能感到非常失望......

From everything I can find, there is NO solution for bulk insert to MySQL and nothing that works with SSIS which is why Microsoft is including in-database analytics with SQL Server 2016 after buying Revolution R Analytics.

I tried to comment on the previous answer but don't have the reputation to do it.

The rsqlserver package needs to run with rClr and neither of those packages are well-behaved, especially because rsqlserver's INSERT functions have poor data type handling. So if you use it, you'll have no idea what you're looking at in the SQL table as much of the information in your data.frame will have been transformed.

Considering the RODBC package has been around for 15 years, I'm pretty disappointed that no one has created a bulk insert function...

不回头走下去 2024-08-11 11:47:58

我们的 n2khelper 包可以使用 bcp(批量复制)(如果可用)。当不可用时,它会回退到多个 INSERT 语句。

您可以在 https://github.com/INBO-Natura2000/n2khelper 上找到该软件包并

安装它使用 devtools::install_git("INBO-Natura2000/n2khelper") 并查找 odbc_insert() 函数。

Our n2khelper package can use bcp (bulkcopy) when it is available. When not available it falls back to multiple INSERT statements.

You can find the package on https://github.com/INBO-Natura2000/n2khelper

Install it with devtools::install_git("INBO-Natura2000/n2khelper") and look for the odbc_insert() function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文