gpt4 book ai didi

sql - RODBC sqlSave表创建问题

转载 作者:行者123 更新时间:2023-12-04 12:12:29 27 4
gpt4 key购买 nike

我在使用RODBC的sqlSave创建表时遇到了麻烦(或更准确地说,是将数据写入到创建的表中)。

这与现有的sqlSave问题/答案不同,因为

  • 他们遇到的问题是不同的,我可以创建表,而他们不能,而
  • 我已经不成功地合并了他们的解决方案,例如在运行sqlSave之前关闭并重新打开连接,还有
  • 错误消息是不同的,唯一的异常(exception)是在以上两种方式中
  • 不同的帖子

    我在Windows RDP上使用MS SQL Server 2008和64位R。

    我有一个简单的数据框,只有1列,包含3、4或5位整数。
    > head(df)
    colname
    1 564
    2 4336
    3 24810
    4 26206
    5 26433
    6 26553

    当我尝试使用sqlSave时,没有数据写入表。此外,一条错误消息听起来好像无法创建该表,尽管该表实际上是用0行创建的。

    根据我发现的建议,我已经尝试在运行sqlSave之前关闭并重新打开RODBC连接。即使我使用 append = TRUE,我也尝试在执行此操作之前先删除表,但这不会影响任何操作。
    > sqlSave(db3, df, table = "[Jason].[dbo].[df]", append = TRUE, rownames = FALSE)
    Error in sqlSave(db3, df, table = "[Jason].[dbo].[df]", :
    42S01 2714 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already
    an object named 'df' in the database.
    [RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE [Jason].[dbo].[df]
    ("df" int)'

    创建表后,我还尝试在表上使用sqlUpdate()。不管是在R还是SQL Server Management Studio中创建它,都会收到错误 table not found on channel
    最后,请注意,在创建新表时以及不使用rownames选项的情况下,我也尝试了不使用append = TRUE的情况。

    来自Freenode的#R的Mr.Flick先生让我检查了是否可以使用sqlQuery读取空表,并且确实可以。

    更新

    我已经完成了以下步骤:
  • 我创建了一个直接连接到SQL Server中我的数据库的ODBC连接,而不是直接连接到默认(主)数据库,然后在table =tablename =语句
  • 中指定了表的路径
  • 如下所示在SQL Server Management Studio中创建表
  • GO CREATE TABLE [dbo].[testing123]( [Person_DIMKey] [int] NULL ) ON [PRIMARY] GO
  • 在R中,我将sqlUpdate与新的ODBC连接一起使用,并且在表名
  • 周围没有方括号
  • 现在sqlUpdate()看到了表,但是它提示它需要一个唯一的列
  • 指示表中的唯一列是带有index = colname的唯一列,导致错误,表明该列不存在
  • 我删除并重新创建了指定主键
  • 的表
    GO CREATE TABLE [dbo].[jive_BNR_Person_DIMKey]( [jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY ) ON [PRIMARY] GO
    生成了名为 PK__jive_BNR__2754EC2E30F848ED的主键和索引(根据SQL Sever Management Studio的GUI界面)
  • 我将此索引/键指定为sqlUpdate()中的唯一列,但出现以下错误:
  • Error in sqlUpdate(db4, jive_BNR_Person_DIMKey, tablename = "jive_BNR_Person_DIMKey", : index column(s) PK__jive_BNR__2754EC2E30F848ED not in database table
    为了记录,我为索引指定了正确的列名(而不是“colname”);感谢MrFlick要求澄清。

    另外,这些步骤在我的帖子中编号为1到7,但是当列表显示时,StackOverflow会重置列表的编号几次。如果有人可以帮助我清理这篇文章的这一方面,我将不胜感激。

    最佳答案

    经过数小时的工作,我终于能够在指定表名的同时使sqlSave正常工作-深呼吸,从哪里开始。这是我为使其工作而要做的事情的 list :

  • 打开32位ODBC管理器并创建一个用户DSN并为您的特定数据库配置它。就我而言,我正在创建一个全局临时表,因此我链接到了tempdb。在odbcConnection(Name)中使用此连接名称。这是我的代码myconn2 <- odbcConnect("SYSTEMDB")
  • 然后,我使用以下代码定义了数据类型:columnTypes <- list(Record = "VARCHAR(10)", Case_Number = "VARCHAR(15)", Claim_Type = "VARCHAR(15)", Block_Date = "datetime", Claim_Processed_Date = "datetime", Status ="VARCHAR(100)")
  • 然后,我使用as.characteras.Date更新了数据框类类型,以匹配上面列出的数据类型。
  • 因为已经工作了几个小时,所以我已经创建了该表,因此我不得不使用sqlDrop(myconn2, "##R_Claims_Data")删除该表。
  • 然后我运行:sqlSave(myconn2, MainClmDF2, tablename = "##R_Claims_Data", verbose=TRUE, rownames= FALSE, varTypes=columnTypes)

  • 然后我的头掉了下来,因为它起作用了!我真的希望这对某人有所帮助。这是帮助我达到这一点的链接:

    Table not found

    sqlSave in R

    RODBC

    关于sql - RODBC sqlSave表创建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23913616/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com