- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用R/RODBC从Microsoft SQL Server数据库查询变量。 RODBC正在将字符串截断为8000个字符。
原始代码:截断为255个字符(根据RODBC文档)
library(RODBC)
con_string <- odbcConnect("DSN")
query_string <- "SELECT text_var FROM table_name"
dat <- sqlQuery(con_string, query_string, stringsAsFactors=FALSE)
部分解决方案:修改查询字符串以截断7999个字符后的文本。
library(RODBC)
con_string <- odbcConnect("DSN")
query_string <- "SELECT [text_var]=CAST(text_var AS VARCHAR(8000)) FROM table_name"
dat <- sqlQuery(con_string, query_string, stringsAsFactors=FALSE)
该表/变量包含长达250,000个字符的文本字符串。我真的很想使用R中的所有文本。这可能吗?
@BrianRipley在以下文档的第18页上讨论了该问题(但没有解决方案):
https://cran.r-project.org/web/packages/RODBC/vignettes/RODBC.pdf
@nutterb讨论了GitHub上RODBCext
包的类似问题:
https://github.com/zozlak/RODBCext/issues/6
在SO上看到了类似的讨论,但没有使用VARCHAR> 8000的RODBC解决方案。
RODBC sqlQuery() returns varchar(255) when it should return varchar(MAX)
RODBC string getting truncated
笔记:
最佳答案
由于这是Microsoft提供的ODBC驱动程序的限制,因此在更改驱动程序之前,几乎没有什么可做的。 @zozlak解释了为什么在您链接的GitHub问题中。
我倾向于在需要时使用存储过程来解决此问题,但这通常需要为每个特定实例编写一个存储过程。在某个时候,我可能会想出一种更通用的在存储过程中执行此操作的方法,但是我发现在存储过程中构造查询的过程既繁琐又令人沮丧。
因此,我花了一些时间来构建一个函数,该函数将执行涉及VARCHAR(MAX)变量的有限查询。这是一种蛮力方法,对于17000个字符的变量,将其导出为三个变量并将其粘贴到R中。这很粗糙,可能不是很有效,但是我想出了最好的解决方案。
另一个限制是它不允许您在查询中重命名变量。您将被数据库中命名的变量所困扰。如果您只涉及几个表,那可能不是问题。在非常复杂的数据库中,这可能会出现问题。但是,至少与此相关,您可以仅查询带有少数必要ID的VARCHAR(MAX)变量,以在R中执行合并。
正如GitHub问题中所讨论的那样,最好尽可能避免VARCHAR(MAX)。如果确实需要未知的长度,则VARBINARY(MAX)会更容易查询。
例子
来源(“https://gist.githubusercontent.com/nutterb/d2e050dada608bb6213e61d0f8471b65/raw/be8717f318b3e3087e7c26c9a8f9d0a582a5daef/query_varchar_max”
channel <- odbcDriverConnect(...)
query_varchar_max(channel = channel,
id = c("idvar"),
varchar_max = c("varchar_max_var", "varchar_max_var2"),
from = "FROM dbo.table_name WHERE group = ?",
data = list(group = "A"))
#' @name query_varchar_max
#' @title Query a VARCHAR(MAX) Variable from SQL Server
#'
#' @description The RODBC driver to SQL Server (SQL Server Native Client 11.0)
#' reports the lenght of a VARCHAR(MAX) variable to be zero. This presents
#' difficulties in extracting long text values from the database. Often, the
#' ODBC will assume a length of 255 characters and truncate the text to that
#' many characters. The approach taken here searches the VARCHAR(MAX) variables
#' for the longest length, and extracts the data in segments to be pasted
#' together in R.
#'
#' @param channel A valid ODBC channel to a SQL Server database.
#' @param id A character vector of ID variables that may be used to merge the
#' data from this query into another dataset.
#' @param varchar_max a character vector of variable names that are to be
#' treated as if they are VARCHAR(MAX) variables.
#' @param from A single character string providing the remainder of the query
#' to be run, beginning with the \code{FROM} statement.
#' @param stringsAsFactors \code{logical(1)}. Should character strings returned
#' from the database be converted to factors?
#' @param ... Additional arguments to \code{sqlExecute} when running the full
#' query.
#'
#' @details \code{query_varchar_max} operates by determining how many columns of up to
#' 8000 characters each are required to export a complete VARCHAR(MAX) variable.
#' It then creates the necessary number of intermediate variables and queries the
#' data using the SQL Server \code{SUBSTRING} command, extracting the VARCHAR(MAX)
#' variable in increments of 8000 characters. After completing the query,
#' the intemediary variables are concatenated and removed from the data.
#'
#' The function makes accommodation for multi-part queries as far as [TABLE].[VARIABLE]
#' formats are concerned. It is not intended for use in [SCHEMA].[TABLE].[VARIABLE]
#' formats. This at least allows \code{from} to include joins for more complex
#' queries. Parameterized queries are also supported through \code{sqlExecute}.
#'
#' @export
query_varchar_max <- function(channel, id, varchar_max, from,
stringsAsFactors = FALSE, ...)
{
coll <- checkmate::makeAssertCollection()
checkmate::assert_class(x = channel,
classes = "RODBC",
add = coll)
checkmate::assert_character(x = id,
add = coll)
checkmate::assert_character(x = varchar_max,
add = coll)
checkmate::assert_character(x = from,
len = 1,
add = coll)
checkmate::assert_logical(x = stringsAsFactors,
len = 1,
add = coll)
checkmate::reportAssertions(coll)
varchar_max_len <-
paste0(
sprintf("MAX(LEN(%s)) AS len_%s",
varchar_max,
sub("[.]", "_", varchar_max)),
collapse = ", "
)
varchar_len <-
unlist(
RODBCext::sqlExecute(
channel = channel,
query = sprintf("SELECT %s %s",
varchar_max_len,
from),
fetch = TRUE
)
)
varchar_max_cols <-
unlist(
mapply(expand_varchar_max,
varchar_max,
varchar_len,
SIMPLIFY = FALSE)
)
Prelim <-
RODBCext::sqlExecute(
channel = channel,
query = sprintf("SELECT %s, %s %s",
paste0(id, collapse = ", "),
paste0(varchar_max_cols, collapse = ", "),
from),
fetch = TRUE,
stringsAsFactors = stringsAsFactors,
...
)
var_stub_to_combine <-
unique(
sub(
"(part)(\\d{1,3})",
"\\1",
sub(".+AS ", "", varchar_max_cols)
)
)
col_to_combine <-
lapply(var_stub_to_combine,
grep,
names(Prelim))
Prelim[sub(".+[.]", "", varchar_max)] <-
lapply(col_to_combine,
function(col) apply(Prelim[col], 1, paste0, collapse = ""))
Prelim[-unlist(col_to_combine)]
}
expand_varchar_max <- function(varchar_max, varchar_len)
{
nvar <- varchar_len %/% 8000 + 1
var_list <- vector("character", length = nvar)
for (i in seq_along(var_list))
{
var_list[i] <-
sprintf("SUBSTRING(%s, %s, %s) AS %s_part%s",
varchar_max,
1 + (i - 1) * 8000,
8000,
paste0(sub("[.]", "_", varchar_max)),
i)
}
var_list
}
关于sql-server - RODBC和Microsoft SQL Server : Truncating Long Character Strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249788/
简单的 R 脚本 library(RODBC) odbChannel Rscript ./RODBC_SIMPLE_TEST.r Error in odbcQuery(channel, query,
我设置了一个 ODBC 连接到 Netezza(SQL 数据库)。连接很好。但是,R 默认只拉出 256 行,并且限制了它可以拉出的行数。 如果我在 Netezza 中运行查询,它将返回总行数 (30
我正在使用提供的 ODBC 驱动程序和 RODBC 测试新的数据库系统。包裹。 我遇到的问题是,仅在几次查询之后(都在 2~3 分钟或更短的时间内),R 不再将连接识别为有效。 具体来说,它只是一个C
在数据库中,我存储了包含特殊字符(例如“§”)的字符串。使用命令 查询() 从包 RODBC“§”被翻译成“?”。对于法语单词中的“'”等字符也是如此。 当然我不能替换每一个“?”通过查询后的特殊字符
我在使用RODBC的sqlSave创建表时遇到了麻烦(或更准确地说,是将数据写入到创建的表中)。 这与现有的sqlSave问题/答案不同,因为 他们遇到的问题是不同的,我可以创建表,而他们不能,而 我
关于此 R 代码的问题: library(RODBC) ch <- tryCatch(odbcConnect("RTEST"), warning=function(w){print("FAIL!
我正在尝试使用 R/RODBC 对 MSSQL 2008 R2 数据库的结构进行编目。我已经设置了一个 DSN,通过 R 连接并使用了 sqlTables()命令,但这只是获取“系统数据库”信息。 l
我有一个返回 varbinary 输出参数的存储过程。我想从 R 调用它并捕获返回变量。我试过: qq <- "declare @mm varbinary(max); exec spTrain_df_
我有一个返回 varbinary 输出参数的存储过程。我想从 R 调用它并捕获返回变量。我试过: qq <- "declare @mm varbinary(max); exec spTrain_df_
我有一个关于使用 sqlSave 的问题。 R 如何将数据框中的 RODBC 数据映射到数据库表列? 如果我有一个包含 X 和 Y 列的表以及一个包含 X 和 Y 列的数据框,RODBC 会将 X 放
这是我第一次尝试在本地 MySQL 数据库和 R 之间来回传递数据。也就是说,我在数据库中创建了一个表并想将数据插入其中。目前,它是一个空白表(使用 MySQL 查询浏览器创建)并且有一个 PK 集。
我正在使用 RODBC 从 MySql Server 获取数据到 R。 所以在数据库的一列中是一个字符向量 SELECT MAX(CHAR_LENGTH(column)) FROM reqtable;
我正在使用 RODBC 包从 R 连接到 Oracle 数据库,但我没有成功合并来自不同数据库的表而没有“下载”这些表(我不想下载它们,因为它们太大了!)。我想使用类似的东西: DBa=odbcCon
我正在尝试将数据从 Access 数据库导入 R。我想导入某些专业的 CIP 代码,其中可能包含前导零。 RODBC 正在将 CIP 代码转换为数字值,即使它在 Access 中被定义为文本。任何人都
相关 https://stackoverflow.com/a/33284035/3358272 ,我发现从 SQL Server (2014) 中提取数据的行为不一致。 library(RODBC)
我想了解 RODBC 如何确定新创建的 (Access) 表的列类型? sqlSave 的 R 文档非常神秘:“类型是通过咨询参数 varTypes 和 typeInfo 来选择的”。并且没有这个论点
我的数据库表大致如下所示: +-----+-------+--------------------+-----------+----------+ | ID1 | ID2 | FilePath1
所以这很奇怪。如果结果集足够大,RODBC 似乎会删除 DateTime SQL 列的时间部分。 (查询是针对 SQL Server 2012 机器运行的,是的,当我在 SQL Server 端运行它
我正在尝试使用R中的SQLite连接RODBC数据库。RODBC可以连接到数据库,但不能使用sqlTables获取数据库中的表列表,该列表返回"0 rows"。该数据库有20个表。 系统:R 3.1.
我想使用 R 脚本将数据框输入到数据库中的现有表中,并且我希望数据库中的表具有顺序主键。我的问题是 RODBC 似乎不允许主键约束。 这是创建我想要的表的 SQL: CREATE TABLE [dbo
我是一名优秀的程序员,十分优秀!