【发布时间】:2016-08-03 22:55:12
【问题描述】:
我有一个返回 varbinary 输出参数的存储过程。我想从 R 调用它并捕获返回变量。我试过了:
qq <- "declare @mm varbinary(max); exec spTrain_df_to_op @mm_outer = @mm output; select @mm as model;"
conStr <- "Driver={SQL Server};Server=.;Database=airline_new;Trusted_Connection=TRUE;"
dbhandle <- odbcDriverConnect(conStr, rows_at_time = 1)
result <- sqlQuery(dbhandle, qq)
这失败了,结果显示为字符(0)。 RODBC 可能不想执行本质上是一系列查询的内容。我将如何解决这个问题?
谢谢!
这是存储过程:
ALTER PROCEDURE [dbo].[spTrain_df_to_op]
@mm_outer varbinary(max) output
AS
BEGIN TRY
exec sp_execute_external_script
@language = N'R',
@script = N'
func <- function() {
in_df[,"DayOfWeek"] <- factor(in_df[,"DayOfWeek"], levels=as.character(1:7))
# The model formula
formula <- ArrDelay ~ CRSDepTime + DayOfWeek + CRSDepHour:DayOfWeek
# Train the model
rxSetComputeContext("local")
mm <- rxLinMod(formula, data=in_df, transformFunc=NULL, transformVars=NULL)
mm <<- serialize(mm, connection=NULL)
}
result = func()
',
@input_data_1 = N'select top 10000 ArrDelay,CRSDepTime,DayOfWeek,CRSDepHour from cleanData',
@input_data_1_name = N'in_df',
@params = N'@mm varbinary(max) output',
@mm = @mm_outer output
END TRY
BEGIN CATCH
THROW;
END CATCH;
我尝试了以下方法:
qq = "declare @mm varbinary(max); select 2 as hello; select 1 as model"
conStr <- "Driver={SQL Server};Server=.;Database=airline_new;Trusted_Connection=TRUE;"
dbhandle <- odbcDriverConnect(conStr, rows_at_time = 1)
result <- sqlQuery(dbhandle, qq)
这仅返回第一个查询的结果:
hello
1 2
我也尝试将查询设置为
qq = paste0("SET NOCOUNT ON; declare @mm varbinary(max); ",
"exec spTrain_df_to_op @mm_outer = @mm output; ",
"SET NOCOUNT OFF; select @mm as model;")
这仍然产生字符(0)。
不能从查询中创建存储过程。
【问题讨论】:
-
qq 的东西是错字对不起。您是否建议在存储过程的末尾添加一个 select 语句,以选择所有输出参数?
-
问题是存储过程还返回一个不是输出参数的结果集。有时我需要结果集,有时需要输出参数。 .
-
它只是返回字符(0)作为结果
-
SQL Server中对应的行输出什么?
-
相同的查询通过 SSMS 正常工作,并在列模型下的表中返回一个 varbinary 作为单个条目。