Sql server 使用R,从存储的进程返回SQL结果,但不返回消息

Sql server 使用R,从存储的进程返回SQL结果,但不返回消息,sql-server,r,stored-procedures,rodbc,Sql Server,R,Stored Procedures,Rodbc,是否有一种方法可以使存储过程中出现的print语句静音,而无需编辑该过程 我使用RODBC从with R运行了一个SQL查询。其他答案指出,SET NOCOUNT ON通常是必需的,以便只返回查询结果,而不返回任何消息 我的问题是,我的查询运行一个存储过程,其中包含一些print语句,SET NOCOUNT ON不会使它们静音。这意味着我的R脚本在命中存储的进程时返回字符(0) 是否有办法只返回结果并禁用存储过程的print语句 我的代码类似于: library(RODBC) # SQL ex

是否有一种方法可以使存储过程中出现的
print
语句静音,而无需编辑该过程

我使用RODBC从with R运行了一个SQL查询。其他答案指出,
SET NOCOUNT ON
通常是必需的,以便只返回查询结果,而不返回任何消息

我的问题是,我的查询运行一个存储过程,其中包含一些
print
语句,
SET NOCOUNT ON
不会使它们静音。这意味着我的R脚本在命中存储的进程时返回
字符(0)

是否有办法只返回结果并禁用存储过程的
print
语句

我的代码类似于:

library(RODBC)

# SQL execution function
execSQL = function(sql){
  db=odbcDriverConnect('driver={SQL Server};server=<server>;database=<database>;trusted_connection=true') 
  on.exit(odbcClose(db))
  sqlQuery(db, sql)
}

# SQL Query
sqlfull <- "
  SET ANSI_WARNINGS OFF;
  SET NOCOUNT ON;

  DECLARE @MYVAR INT
  INSERT INTO @MYVAR (SELECT TOP 1 BLAH FROM MYTABLE)
  ;

  CREATE TABLE #TEMP (OUT1 INT, OUT2 FLOAT)
  INSERT INTO #TEMP (OUT1, OUT2)
  EXEC SP_MYPROC @MYVAR
  ;

  SET NOCOUNT OFF;
  SELECT * FROM #TEMP t1 
  JOIN OTHERTABLE t2 on t1.OUT1 = t2.OUT2"

# Cleanup query
sql <- gsub(pattern = '\n', replacement = " ", x = sqlfull)

# Execute SQL
SQLOutput <- execSQL(sql)

# Returns character(0)
库(RODBC)
#SQL执行函数
execSQL=函数(sql){
db=ODBCDriverConnection('driver={SQL Server};Server=;database=;trusted_connection=true'))
打开。退出(odbcClose(db))
sqlQuery(数据库,sql)
}
#SQL查询

sqlfull我的SQL存储过程中一直有print语句。这对我来说一直很有效:

get_table_from_sql = function(sql) {
    conn <- RODBC::odbcConnect(dsn = "MYSQLSERVER")
    sql_data = RODBC::sqlQuery(conn, sql)
    RODBC::odbcClose(conn)
    return(sql_data)
}

你的代码看起来像什么?我从来没有遇到过这个问题,我使用了
sqlQuery
(见下面的答案),我已经添加了一个代码的示例模板和一个注释。谢谢lebelinoz。我添加了我的代码,它与您的代码只有细微的不同。我包括了一些细节,例如临时表的使用和变量设置,但我认为这些与问题无关,因为1)它们在sp有其print语句之前运行良好,2)在SSMS上运行完整查询通常会使用messages选项卡中的print语句返回结果。抑制打印在过去是有效的,但如果可能的话,我希望不编辑该过程。我所能建议的是,您可能在sql字符串中做了太多的工作。考虑编写一个存储过程,它封装您需要的所有内容(包括创建一个临时表)并调用它。不幸的是,这样一个存储的进程无论如何都必须调用违规存储的进程,所以打印语句仍然会返回。在我的经验中,一个简单的调用存储过程(如在我的例子中)。即使存储过程有print语句,也可以工作。如果您直接调用
execSQL(“EXEC SP_MYPROC n”)
,其中
n
是一个可以与
SP_MYPROC
一起使用的数字,会发生什么情况?我无法尝试您的建议,因为进程最终还是得到了更新并删除了打印语句。不过,我仍然对此感到好奇,一旦有机会,我会再试一次并报告。
get_table_from_sql("EXEC my_procedure")