使用R,返回SQL结果,但不返回存储过程中的消息

时间:2017-09-11 00:34:42

标签: sql-server r stored-procedures rodbc

有没有办法将存储过程中发生的print语句静音,而无需编辑过程?

我使用R中的RODBC运行SQL查询。其他答案已经解决,通常需要SET NOCOUNT ON才能返回查询结果而不返回任何消息。

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

有没有办法只返回结果并将存储的proc 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)

重要的是要注意,在存储的proc添加了print语句之前,这一问题没有问题。此SQL查询在SSMS上运行时没有问题。

1 个答案:

答案 0 :(得分:0)

我的SQL存储过程中一直有打印语句。这一直对我有用:

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

其中MYSQLSERVER将由您自己的服务器名称替换。你这样称呼它:

get_table_from_sql("EXEC my_procedure")