Estoy intentando ejecutar un script R (específicamente dplyr) en SQL como parte de un procedimiento almacenado ETL. Tanto el código R y la consulta SQL parecen haber tenido éxito creo que las mentiras de problemas cuando se intenta manipular la salida El error fui lanzado el siguiente error: "Sintaxis incorrecta cerca de ';' Esperando conversación."
Mi fuente de esta estructura es: https://docs.microsoft.com/en-us/sql/advanced-analytics/r/creating-workflows-that-use-r-in-sql-server?view=sql-server -ver15
EXECUTE sp_execute_external_script @language = N'R'
, @script = N'
rm(list = ls(all.names = TRUE))
library(dplyr)
library(tidyr)
library(rlang)
library(lubridate)
OutputDataSet <- InputDataSet %>% mutate(Date=as.Date(effective)) %>% select(-effective) %>%
group_by(rowno_dmddmhi_dmd) %>%
tidyr::complete(Date = seq.Date(min(Date), max(Date), by="day"))%>% fill(balance)%>%
mutate(amount = ifelse(is.na(amount), 0, amount))%>%mutate(opp_amount = amount * -1) %>%
arrange(rowno_dmddmhi_dmd,desc(Date)) %>% group_by(rowno_dmddmhi_dmd) %>%
mutate(cumsum = cumsum(opp_amount))%>%group_by(rowno_dmddmhi_dmd)%>%
mutate(balance.at.date=balance + cumsum)%>%ungroup() %>% mutate(Report_Date=as.Date(Date)-1)%>%select(rowno_dmddmhi_dmd,Date,balance.at.date,Report_date);'
, @input_data_1 = N'SELECT data_.rowno_dmddmhi_dmd,
dmd.balance,
Sum(data_.amount) AS amount,
data_.effective
FROM (
--Top False Cap
SELECT dmhi.rowno,
dmhi.rowno_dmddmhi_dmd,
0 AS amount,
CONVERT(Date, Getdate()) AS effective
FROM ks208.dbo.dmd
INNER JOIN dmon208.dbo.dmhi
ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
UNION
SELECT dmhi.rowno,
dmhi.rowno_dmddmhi_dmd,
dmhi.amount,
CONVERT(Date, dmhi.effective) AS effective
FROM ks208.dbo.dmd
INNER JOIN ks208.dbo.dmhi
ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
UNION
SELECT dmhi.rowno,
dmhi.rowno_dmddmhi_dmd,
dmhi.amount,
CONVERT(Date, dmhi.effective) AS effective
FROM dmon208.dbo.dmd
INNER JOIN dmon208.dbo.dmhi
ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
-- False Bottom Cap
UNION
SELECT dmhi.rowno,
dmhi.rowno_dmddmhi_dmd,
0 AS amount,
CONVERT(Date, Dateadd(year, -4, Getdate())) AS effective
FROM ks208.dbo.dmd
INNER JOIN dmon208.dbo.dmhi
ON dmd.rowno = dmhi.rowno_dmddmhi_dmd) AS data_
INNER JOIN ks208.dbo.dmd
ON dmd.rowno = data_.rowno_dmddmhi_dmd
WHERE Year(data_.effective) >= Year(Getdate()) - 4
GROUP BY data_.rowno_dmddmhi_dmd,
data_.effective,
dmd.balance
'
with RESULT sets (("rowno_dmddmhi_dmd" int not null, "Date" Date not null, "balance.at.date" float not null, "Report_date" Date not null ));
end;
Me he dado cuenta de su origen de la estructura de la autora es la definición de una prueba de la tabla en la parte superior de su consulta. Se utiliza comandos 'GO' para hacer esto y luego iniciar su procedimiento. No es necesario que un proceso como este por encima de su procedimiento almacenado, por lo que la declaración final al final de la consulta es redundante. Quitarlo y ver lo que sucede?