如何将 NULL 值从 R 脚本发送到 SQL 中的 REAL 类型列

问题描述 投票:0回答:1

我将变量定义为:

OVERLAY_LEVEL <- "overlay"

OVERLAY_LEVEL_NAME <- "OVERLAY_LEVEL"

BASE_WEDGE <- "base"

OVERLAY_TYPE <- "Get_OVERLAY_TYPE"

重叠模式<- "Get_OVERLAY_MODE_PCST"

展望_MONTH <- 2024-03-01 UTC

START_DATE <- 2024-04-01 UTC

END_DATE <- 2024-04-30UTC

油<- 200

天然气<- 200

评论<- "Get_comments"

NGL<- NULL

我构建了一个数据框:

df.base <- data.frame( OVERLAY_LEVEL
                       ,OVERLAY_LEVEL_NAME
                       ,BASE_WEDGE
                       ,OVERLAY_TYPE
                       ,OVERLAY_MODE
                       ,OUTLOOK_MONTH
                       ,START_DATE
                       ,END_DATE
                       ,OIL
                       ,GAS
                       ,NGL
                       ,COMMENTS
                       )

SQL 表定义为:

CREATE TABLE TEST(
    [OVERLAY_LEVEL] [varchar](20) NOT NULL,
    [OVERLAY_LEVEL_NAME] [varchar](50) NOT NULL,
    [BASE_WEDGE] [varchar](20) NOT NULL,
    [OVERLAY_TYPE] [varchar](50) NOT NULL,
    [OUTLOOK_MONTH] [date] NOT NULL,
    [START_DATE] [date] NOT NULL,
    [END_DATE] [date] NOT NULL,
    [OIL] [real] NULL,
    [GAS] [real] NULL,
    [COMMENTS] [varchar](max) NULL,
    [OVERLAY_MODE] [varchar](50) NULL,
    [NGL] [real] NULL
) 

但是我收到错误:

Error in data.frame(OVERLAY_LEVEL, OVERLAY_LEVEL_NAME, BASE_WEDGE, OVERLAY_TYPE,  : 
  arguments imply differing number of rows: 1, 0

基本上,我想在 SQL 中将 NGL 列设置为 NULL(无值)。

我如何实现这一目标? 设置

NGL <- NA
将 NGL 值发送为 0,这不是我想要的。

向SQL插入数据的代码:

  con <- odbcDriverConnect("Driver=ODBC Driver 17 for SQL Server; Server=test;Uid=xx; Pwd=xxx") 
#Save the changes to the database

startIndex <- 1
insertsRemaining <- nrow(df.base)
 
    while(insertsRemaining>0) #INSERT DIRECTLY INTO THE OVERLAYS TABLE
    {
      stopIndex <- startIndex + min(insertsRemaining, 1000) - 1
      dfLimit <-  df.base[startIndex:stopIndex,]
      
      values <- paste("('",dfLimit$OVERLAY_LEVEL,"','",dfLimit$OVERLAY_LEVEL_NAME,"','",
                      dfLimit$BASE_WEDGE,"','",
                      dfLimit$COMMENTS,"','",
                      dfLimit$OVERLAY_TYPE,"','", 
                      dfLimit$OVERLAY_MODE,"','",
                      dfLimit$OUTLOOK_MONTH, "','",
                      dfLimit$START_DATE,"','" ,
                      dfLimit$END_DATE,"','" ,
                      dfLimit$OIL,"','" ,
                      dfLimit$GAS,"','",
                      dfLimit$NGL,"')", sep="", collapse=",")
      
      sqlINSERT_command = sqlQuery(con, paste("INSERT INTO TEST_TABLE ([OVERLAY_LEVEL],
                                              [OVERLAY_LEVEL_NAME],[BASE_WEDGE],[COMMENTS],[OVERLAY_TYPE],[OVERLAY_MODE],[OUTLOOK_MONTH],[START_DATE],[END_DATE],[OIL],[GAS],[NGL]) VALUES",values))
      
      startIndex <- startIndex + nrow(dfLimit)
      insertsRemaining <- insertsRemaining - nrow(dfLimit)
  
 
  #browser()
}
r sql-server
1个回答
0
投票

这是一个正确的答案,但是解决了 SQL 方面的问题。请注意,从

INSERT
语句中省略某一列将导致为该列插入
NULL
。因此,您可以从选择列表中省略
NGL
来获得您想要的行为。

INSERT INTO TEST_TABLE ([OVERLAY_LEVEL], [OVERLAY_LEVEL_NAME], [BASE_WEDGE], [COMMENTS],
    [OVERLAY_TYPE], [OVERLAY_MODE], [OUTLOOK_MONTH], [START_DATE], [END_DATE], [OIL], [GAS])
VALUES
    -- tuples not including any value for NGL
  
© www.soinside.com 2019 - 2024. All rights reserved.