通过RODBC导入SQL-隐式后的值是否错误?类型转换

Bjo*_*Sch 1 sql-server import r type-conversion

我在SQL表中有一列,其中包含15位数字ID,在MSSQL中存储为nvarchar(255)(例如'30000005000008498')。

如果我使用robdc库对此运行sql查询,则数据将隐式转换为数字。

library("RODBC")

odbcChannel <- odbcConnect("TableName")

ID <- sqlQuery(odbcChannel, "SELECT DISTINCT [ID] FROM TEST4")
Run Code Online (Sandbox Code Playgroud)

我已经通过验证了

str(ID)
Run Code Online (Sandbox Code Playgroud)

我尝试的下一件事是使用以下方法将数据转换为字符

ID <- as.character(ID)
Run Code Online (Sandbox Code Playgroud)

这可以正常工作而不会收到错误消息。不幸的是,部分数据被更改了,这对于唯一的ID来说是有害的:

最小示例:

a = 30000005000008498
b <- as.character(a)
Run Code Online (Sandbox Code Playgroud)

输出为:

[1] "30000005000008496"
Run Code Online (Sandbox Code Playgroud)

我认为这可能与数字的最大大小有关。对于较小的数字,as.character可以正常工作。但是,我不知道从SQL导入时如何保留初始ID。

问题1:是否有可能避免对num的隐式排印?

Question2:有什么想法可以在不更改R的情况下从SQL导入15位字符串吗?

Nie*_*rts 5

使用as.is = TRUE。

testid <- sqlQuery(database,"SELECT CAST(id as CHAR) as id from my_table", as.is=TRUE);
Run Code Online (Sandbox Code Playgroud)

即使数据库中的列ID为数字,testid也将是包含字符输入的数据框。我认为可以为每列分别设置as.is(使用as.is = c(..))或同时为所有列设置。

当列已经是VARCHAR类型时,可能不需要CAST(.. as CHAR)。