Я хочу предварительно обработать текст, переданный механизму sql
в knitr, чтобы он мог обрабатывать код, сгенерированный моим SQL серверным инструментарием, который выводит код вида
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE dbo.Person(
Person int NOT NULL,
acct varchar(1) NOT NULL,
Kpl varchar(10) NULL,
Fac varchar(10) NULL,
Inst varchar(10) NULL,
CONSTRAINT PK_Person PRIMARY KEY CLUSTERED
(
Person ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY
) ON PRIMARY
GO
ALTER TABLE dbo.Person ADD DEFAULT (getdate()) FOR _Timestamp
GO
ALTER TABLE dbo.Person ADD DEFAULT (host_name()) FOR _Hostname
GO
ALTER TABLE dbo.Person ADD DEFAULT (original_login()) FOR _Username
GO
В настоящее время у меня есть следующий код двигателя; кажется, что он работает для вязания, но когда я запускаю его с помощью кнопки воспроизведения в RStudio, кажется, что он ничего не делает.
knitr::knit_engines$set(tsql = function(options) {
code <- paste(options$code, collapse = "\n")
code <- paste(c("\n", code, "\n"), collapse='') # so that GOs at the start or end will be picked up
code <- strsplit(code, "(?i)\nGO\n", perl = TRUE)[[1]] # split into chunks. R returns a matrix even if you give it a string, so pick the first element
code
# trim chunks and remove empty
code <- stri_remove_empty(str_trim(code))
# split chunks into arrays again
code <- lapply(code, function(c) { return(strsplit(c, "\n")[[1]])})
sql <- knitr::knit_engines$get('sql')
# apply sql engine to all chunks
lapply(code, function(c) {
options$code <- c
sql(options)
})
})