首页 > 解决方案 > 将整个 SQL Server 表导入 R

问题描述

我在 SQL Server 中有一个表,想将整个表导入 R 以执行一些工作。

我正在尝试为此找到最佳路径,因为表大小可能很大(约 6000 万)

SQL Server 中有一个 bcp Utility 命令行实用程序,这是一种选择。

但是有人有其他建议吗?

标签: sqlrdata.table

解决方案


您可以sqlcmd用于批量查询。它比 Microsoft 的 ODBC 驱动程序(或 FreeTDS)可以做的任何事情都快得多。

如果您的查询是(比如说)

SELECT Id, Field1, Field2 FROM TableName WHERE Field1 = 'QUUX'

然后你的命令行会是这样的:

sqlcmd -S serveraddress -d databasename \
  -U username -P '*PASSWORD*' \
  -W -s , -o out.csv \
  -Q "SET NOCOUNT ON; SELECT Id, Field1, Field2 FROM TableName WHERE Field1 = 'QUUX'"

(如果您的服务器位于非标准端口上,请使用-S serveraddress,portnumber.)

我倾向于不喜欢 R system(或者system2,薄单板),而是更喜欢processx包,因为它更安全地处理命令行参数。

bgquery <- processx::run("sqlcmd",
    args = c("-s", "serveraddress", "-d", "databasename",
             "-U", "username", "-P", "*PASSWORD*", "-W", "-s", ",", "-o", "out.csv",
             "-Q", "SET NOCOUNT ON; SELECT Id, Field1, Field2 FROM TableName WHERE Field1 = 'QUUX'"),
    error_on_status = FALSE, echo_cmd = FALSE, echo = FALSE)

# check its stdout, it can be rather verbose
tail(bgquery$results$stdout)

# check the return value, typically "0" for command success
bgquery$results$status

# if error, look at the error output, something might be in the stdout above, too
bgquery$results$stderr

此时,读入文件:

x <- data.table::fread("out.csv", nrows = 3, na.strings = c("NA", "", "NULL"))

注意:sqlcmd引用值。例如,

SELECT 'hello,world' as A

使用sqlcmd将返回

A
hello,world

这显然是坏的。如果这是一个问题,您可能会被卡住。bcp是另一种有其自身问题的选择,因此它不是完美的替代品。


推荐阅读