SQL R 中的块 - 多个语句和临时表

SQL chunks in R - Multiple statements and temp tables

我正在尝试 运行 R 笔记本块中的 SQL 脚本。但是,如果在同一块中有多个 SQL 语句(不生成结果集),则最终 SELECT return 没有结果。

  1. 我的连接正常。数据库服务器 运行s SQL 服务器.
  2. 我的块只包含一个语句 return 在数据帧中输出。
  3. 但是,我还需要在脚本中进行多次 SQL。我想一路创建临时 tables 并使用它们来驱动一些聚合。我想将结果保存到临时文件 table 中,并以来自临时文件 table 的单个 SELECT 语句结束,从块中生成输出。
  4. 我尝试将脚本保存到一个文件中,并为块使用 code 属性。那只是让我犯了一个关于最后一行不完整的错误。我不需要单独的文件。我只是想用另一种方法来解决这个问题,但我也无法做到这一点。

还没解决,一直追不到问题。也许 SQL 块甚至不支持我想让它们做的事情。有什么想法吗?

这里有一些玩具示例。

这个块有效,returning 一个数据帧。

```{sql test, connection=con, output.var = "test_df"}
select  TABLE_NAME
from    INFORMATION_SCHEMA.TABLES
where   TABLE_SCHEMA = 'dbo';
```

这个玩具块return没什么。

```{sql test2, connection=con, output.var = "test2_df"}
drop table if exists #tables;
select  TABLE_NAME
into    #tables
from    INFORMATION_SCHEMA.TABLES
where   TABLE_SCHEMA = 'dbo';

drop table if exists #columns;
select  TABLE_NAME,
        COLUMN_NAME
into    #columns
from    INFORMATION_SCHEMA.COLUMNS
where   TABLE_SCHEMA = 'dbo'
and     TABLE_NAME in (
        select  top 3
                TABLE_NAME
        from    #tables)
order by 1, 2;

select  *
from    #columns;
```

一种可能的解决方案是在块的顶部添加 set nocount on,如下所示:

```{sql test2, connection=con, output.var = "test2_df"}
set nocount on

drop table if exists #tables;
select  TABLE_NAME
into    #tables
from    INFORMATION_SCHEMA.TABLES
where   TABLE_SCHEMA = 'dbo';

drop table if exists #columns;
select  TABLE_NAME,
        COLUMN_NAME
into    #columns
from    INFORMATION_SCHEMA.COLUMNS
where   TABLE_SCHEMA = 'dbo'
and     TABLE_NAME in (
        select  top 3
                TABLE_NAME
        from    #tables)
order by 1, 2;

select  *
from    #columns;

另一种选择是使用 CTE,像这样

```{sql test2, connection=con, output.var = "test2.df"}
WITH TABLES AS (
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo'
)
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME IN (
  SELECT TOP 3 TABLE_NAME FROM TABLES
)
ORDER BY 1,2;