我将变量定义为:
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()
}
这是一个正确的答案,但是解决了 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