这应该算是一个R语言编程中的基本操作,但本人正好这几天用到,在网络上查找了一下,有一些答案,但其中有的靠谱,有的没有试验成功,而一些靠谱的解决方案我觉得说的不够透彻,举例不够简明。在大数据流行的今天,可能很多同学会遇到相同的情境,故发此贴以资参考。
R语言版本 3.4.3
SQL版本 2014
样例库:已导入SQL的上市公司资产负债表
数据库链接方式: RODBC包+DSN句柄设置
操作目的:提取某期的全市场资产负债表
首先说基本原理。个人体会,sqlQuery()函数有两个主要参数,一个是channel,它是R语言与SQL数据库的链接,这个由之前的odbcConnect建立,本例中采用的是事先在“控制面板-管理工具-数据源(ODBC)”中预先设定的相关数据库句柄加以引用;另一个是query,其实它就是一个字符串,而这个字符串传递到SQL中就应该是一条SQL可以正常理解的SQL语句,所以它一定要符合SQL的语法规则,但正因为它必须是一个整个的字符串,所以想将变量加入其中且清晰明了,个人以为还是在之前加工这个字符串比较合适,网上很多例子是直接将字符串的加工过程写入了sqlQuery语句,当然可行,但对初次接触者可能看得有点晕,其实也减少了程序的可读性,我认为。
其次,有一个例子说明一下这个过程,不写循环了,简单的就是用变量调取2016年年报,即上报时间(Accper)为2016-12-31的全市场资产负债表。程序如下:
> x1 <- 2016 #这个可以是逐渐递增或递减的变量
> cx1 <- as.character(x1) #转换为字符型变量
> dd <- c("-12-31","-03-31","-06-30","-09-30") #一年四期报表的月日,可以通过下表循环
> cod <- paste("'", cx1, dd[1], "'", sep="") #加工成时间条件
# ✲请特别注意上面语句,为符合SQL语法,要在加工的字符串两侧加上单引号“ ' ”✲
> cod
[1] "'2016-12-31'"
> cond <- paste("SELECT * FROM dbo.FS_Combas WHERE Accper =" ,cod, "AND Typrep='A' ",sep=" ")
#加工整个query参数,即传递到SQL的提取语句,分隔符为空一格
> cond
[1] "SELECT * FROM dbo.FS_Combas WHERE Accper = '2016-12-31' AND Typrep='A' "
> library(RODBC) #调用RODBC包
> th <- odbcConnect("SQL01", "LENOVO-PC", "SQL登录密码") #调用句柄与SQL数据库链接
> tt <- sqlQuery(th, cond) #提取数据
> dim(tt)
[1] 3218 129
最后,大家可以试一试,祝顺利。