使用R通过ODBC连接SQL Server时出现无效对象名错误
解决R中dbReadTable读取SQL Server带Schema表的报错问题
这个问题我之前也碰到过!原因很简单:当你用dbReadTable(conn, "Person.Person")时,odbc包会自动把整个表名字符串套上双引号,生成的SQL语句变成了SELECT * FROM "Person.Person"——但在SQL Server里,这种写法会把"Person.Person"当成单个完整的表名,而不是我们想要的「Schema(Person).表(Person)」结构,数据库找不到这个不存在的表,就抛出了42S02对象不存在的错误。
下面给你几个靠谱的解决方法:
方法一:分开指定Schema和表名(最推荐)
dbReadTable其实支持单独传入schema参数,直接把Schema和表名分开写,它就会自动生成正确的SQL语句:
dbReadTable(conn, schema = "Person", name = "Person")
这种方式完全符合数据库的对象命名规范,不会有额外的引号问题。
方法二:用Id对象明确指定表信息
如果需要更清晰地声明数据库对象(比如表名带特殊字符、跨库访问等场景),可以用DBI::Id来封装Schema和表名:
dbReadTable(conn, name = DBI::Id(schema = "Person", table = "Person"))
这种写法可读性更强,也能避免各种命名歧义。
方法三:关闭自动加引号(应急用,不推荐常规使用)
如果你不想改调用参数,可以在创建连接时关闭odbc的自动引号功能,这样dbReadTable就不会给表名加双引号了:
conn <- dbConnect(odbc::odbc(), Driver = "SQL Server", Server = "...", Database = "AdventureWorks2012", QuoteIdentifiers = FALSE)
之后再运行dbReadTable(conn, "Person.Person")就能生成正确的SELECT * FROM Person.Person语句。不过要注意:如果你的Schema或表名包含空格、SQL保留字(比如Order),这种方法会导致新的错误,所以只适合应急场景。
内容的提问来源于stack exchange,提问作者Sasha Babaei
相关产品推荐
相关产品推荐

