我可以动态生成的SQL Server 2016年存储过程对结果集条款?

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

我在哪里执行的R脚本的存储过程,并返回一个数据帧作为输出。该程序将查询链接的服务器,执行各种对原始查询的结果的变换,并返回生成的数据帧。

下面是我的环境的详细信息:

Product: Microsoft SQL Server Enterprise (64-bit)
Operating System: Microsoft Windows NT 6.3 (9600)
Platform: NT x64
Version: 13.0.5216.0

在存储过程中的脚本如下:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
library(jsonlite)
library(purrr)
library(tidyr)
library(dplyr)
library(lubridate)

##store initial query as a data frame
goldInstrumentDF <- data.frame(InputDataSet)

##set load_ts as a timestamp
formattedDF <- transform(goldInstrumentDF, load_ts = ymd_hms(as.character(goldInstrumentDF$load_ts)))

##set all other column values as characters
i <- sapply(formattedDF, is.factor)
formattedDF[i] <- lapply(formattedDF[i], as.character)

##unpack json object
firstTransform <- formattedDF %>%
  mutate(event = map(event, ~ fromJSON(.) %>% as.data.frame())) %>%
  unnest(event)

##store load events in a data frame
loadEvents <- firstTransform[firstTransform$object.method == "IMM_Equipment_RePro_Load_Event", ]

##store equipment events in a data frame
equipmentEvents <- firstTransform[firstTransform$object.method != "IMM_Equipment_RePro_Load_Event", ]

##parse the initial characters from the non-standard data exchange format
equipmentSubstring <- equipmentEvents %>% mutate(object.object = substring(equipmentEvents$object.object, 19))

##remove the curly bracked from the end of the non-standard data exchange format
equipmentSubstring2 <- equipmentSubstring %>% mutate(object.object = gsub(''.$'', '''', equipmentSubstring$object.object))

##remove the single quotes from the non-standard data exchange format
equipmentSubstring3 <- equipmentSubstring2 %>% mutate(object.object = gsub("''", "", equipmentSubstring2$object.object))

##split the data from the non-standard data exchange format into a header and a value
namev<-function(x) {
  a<-strsplit(x,"=")
  setNames(sapply(a,''['',2), sapply(a,''['',1))
}

##turn each row into a named vector
secondTransform <- lapply(strsplit(equipmentSubstring3$object.object, ","), namev)

##find list of all column names
thirdTransform <- unique(unlist(sapply(secondTransform, names)))

##extract data from all rows for every column
fourthTransform <-do.call(rbind, lapply(secondTransform, ''['', thirdTransform))

##rejoin with original data
fifthTransform <-cbind(equipmentSubstring3[,-25], fourthTransform)

##remove exraneous columns
drops <- c(" error", "object.object", NA)
sixthTransform <- fifthTransform[ , !(names(fifthTransform) %in% drops)]

##output the data frame
OutputDataSet <- as.data.frame(sixthTransform)',
@input_data_1 = N'SELECT * FROM openquery(KMhivehttp, ''select * from dmfwk_gold.instrumentapps_event;'');

有没有办法对我来说,动态地定义与基于我数据帧中的数据结果集条款?

r stored-procedures ssms sql-server-2016
1个回答
0
投票

不,你不能这样做,因为WITH RESULTS SET是存储过程执行的一部分。我猜你会想这样做,因为你的sixthTransform,在卸下错误的列?

如果是这样的话(去除列),也许会更好,如果你返回的错误列,但让他们分配一个“神奇”的价值?这样,你总能得到一个确定的结果集回来。

© www.soinside.com 2019 - 2024. All rights reserved.