Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL到R数据读取更改数据_Sql_Sql Server_R - Fatal编程技术网

SQL到R数据读取更改数据

SQL到R数据读取更改数据,sql,sql-server,r,Sql,Sql Server,R,我在MSSQL数据库中有很多数据。我已经编写了一个查询来获取我需要的数据,并希望将这些数据加载到R中进行分析 问题:将数据加载到R中时,我的CustomerID号正在被更改,即SQL server中的CustomerID将显示为“xxxx0101”[我已用xxxx截断CustomerID字段,以显示它仅在接近尾端时被更改],但在R中它显示为“xxxx2724”(引号不是用来表示字符串:SQL中的数据类型是varchar(30);R显示为自动分配数据类型)。此外,它将对我的数据值进行舍入(SQL:

我在MSSQL数据库中有很多数据。我已经编写了一个查询来获取我需要的数据,并希望将这些数据加载到R中进行分析

问题:将数据加载到R中时,我的CustomerID号正在被更改,即SQL server中的CustomerID将显示为“xxxx0101”[我已用xxxx截断CustomerID字段,以显示它仅在接近尾端时被更改],但在R中它显示为“xxxx2724”(引号不是用来表示字符串:SQL中的数据类型是varchar(30);R显示为自动分配数据类型)。此外,它将对我的数据值进行舍入(SQL:2.84…7366 R:2.84…6575)

SQL表结构:

CustomerID  | DataValue
xxxxxxx0101 | 2.84...7366
在R中,相同的信息显示为:

CustomerID  | DataValue
xxxxxxx2724 | 2.84...6575
我不明白为什么R会改变我字段的值

R代码:

require(RODBC)
myScript = paste(gsub("\t", " ", readLines("TestQuery.sql")), collapse = " ")
myData = data.frame(sqlQuery(myDBConnection, myCode))
View(myData)
将paste()和gsub()函数添加到主readLines()中,以消除\t(for tab)之类的内容,并将我的多行SQL查询存储到一个字符串中。我不认为这是导致问题的原因,我已经将myScript的结果直接粘贴回MSSQL服务器,并验证它返回的结果与TestQuery.sql完全相同

我正在使用RODBC包连接我的R和SQL。不确定是否使用正确的软件包,是否有更新的软件包不存在此问题。如果我正在运行一个小的测试查询,比如:

data.frame(sqlQuery(myDBConnection, "select top 10 CustomerID from CustList 
order by CustomerID"))
我只是有一些客户ID的问题,其他的都是正确的

有趣的事实:我的同事运行了我的SQL查询,从中创建了一个SAS数据集,然后将SAS中的数据集作为数据帧加载到R中,没有我上面提到的问题(他使用R中的Haven库读取SAS数据集)

更新:我试图首先初始化一个character类型的空数据帧,然后使用stringsAsFactors=FALSE一次加载一个CustomerID。代码如下:

foo = sqlQuery(myDBConnection, "select top 10 CustomerID from CustList 
order by CustomerID", stringsAsFactors = FALSE)
testDF = data.frame(CustomerID = character(), stringsAsFactors = FALSE)
for( i in 1:10 )

{
   testDF[i,1] = foo[i,1]
}
View(testDF)
然而,10个customerID中有8个没有改变,更改的两个在最后被+1改变。我认为这与以下事实有关,即本系列中的下一个只是上一个的一个,即它将是xx100,然后是xx101,并打印两次xx100。注意:每个CustomerID都是唯一的,因此在原始数据集中不会发生这种情况,并且已经过验证


我想循环调用我的sqlQuery(),而不是先将数据加载到'foo'中,但我不知道在我的sqlQuery函数中放置一个迭代变量。如果有人知道,我们将不胜感激。

如果您的SQL Server版本为2016,您可以在SQL Server本身中使用R功能,并且不会出现此转换错误

如果您的SQL Server版本为2016,您可以在SQL Server本身中使用R功能,而且它不会给出这种转换错误

在您描述的场景中,听起来您只是从SQL返回了两个不同的记录(每个记录都有自己唯一的CustomerID值),因为您没有显式地排序或过滤数据

您的测试sql查询:

"select top 10 CustomerID from CustList"
如果没有明确的WHERE或ORDER BY语句,则不能保证从SQL中获得相同的“前10个”记录

在SQL查询的末尾添加ORDERBY语句将确保每次返回的记录顺序相同

"select top 10 CustomerID from CustList order by CustomerID"

在您描述的场景中,听起来您只是从SQL返回了两个不同的记录(每个记录都有自己唯一的CustomerID值),因为您没有显式地排序或过滤数据

您的测试sql查询:

"select top 10 CustomerID from CustList"
如果没有明确的WHERE或ORDER BY语句,则不能保证从SQL中获得相同的“前10个”记录

在SQL查询的末尾添加ORDERBY语句将确保每次返回的记录顺序相同

"select top 10 CustomerID from CustList order by CustomerID"

毫不奇怪,两个数据类型根本不同的系统之间的数据类型会有所不同。然而,我从来没有听说过R任意改变数字,在我这么多年的工作中,这种情况从未发生在我身上。非常奇怪。。。您是否可以使用
RODBC
查询内置数据集(如
RODBC
vignette)给出一个可重复的示例?在SQL数据中,是customer
2724
2.84…6575
的数据值?或者完全是别的什么?Re:@Chris CustomerID是x0101(截断的),值是2.84..(截断的)…7366Re:@Hack-R我对R不太熟悉,不知道如何给你一个内置数据库来测试在sql中运行查询时从sql_表中选择数据值的结果
SELECT DataValue,其中CustomerID='xxxxxxx2724'
(将sql_表替换为您的表名,将xxx表替换为您在R中看到的数字)。我想说的是,如果你的ID和值不同,可能不是ID和值错了,而是你拉错了。毫不奇怪,两个数据类型根本不同的系统之间的数据类型会不同。然而,我从来没有听说过R任意改变数字,而且一年来都没有我一直在做这件事。这在我身上从未发生过。非常奇怪……你能给出一个可重复的例子,使用
RODBC
查询内置数据集,如
RODBC
vignette?在你的SQL数据中,是customer
2724
2.84…6575
?还是完全是其他的?Re:@Chris the CustomerID是x0101(被截断),值是2.84..(被截断)…7366Re:@Hack-R我对R不熟悉,不知道如何为您提供一个内置数据库来测试在sql中运行查询时,查询的结果是什么(用您的表名替换sql_表,用您在R中看到的数字替换xxx)。我的意思是,如果您的ID和值不同,可能不是ID和值错误,而是您拉错了pairI。如果使用order by子句,我忘了将其添加到代码samp中