SQL R 中的块 - 多个语句和临时表
SQL chunks in R - Multiple statements and temp tables
我正在尝试 运行 R 笔记本块中的 SQL 脚本。但是,如果在同一块中有多个 SQL 语句(不生成结果集),则最终 SELECT return 没有结果。
- 我的连接正常。数据库服务器 运行s SQL 服务器.
- 我的块只包含一个语句 return 在数据帧中输出。
- 但是,我还需要在脚本中进行多次 SQL。我想一路创建临时 tables 并使用它们来驱动一些聚合。我想将结果保存到临时文件 table 中,并以来自临时文件 table 的单个 SELECT 语句结束,从块中生成输出。
- 我尝试将脚本保存到一个文件中,并为块使用
code
属性。那只是让我犯了一个关于最后一行不完整的错误。我不需要单独的文件。我只是想用另一种方法来解决这个问题,但我也无法做到这一点。
还没解决,一直追不到问题。也许 SQL 块甚至不支持我想让它们做的事情。有什么想法吗?
- 在 R notebook SQL 块中,是否可以 运行 多个 SQL 语句?
- 是否可以创建临时文件 table 并在同一块内的后续语句中引用它?
- 是否可以在 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;
我正在尝试 运行 R 笔记本块中的 SQL 脚本。但是,如果在同一块中有多个 SQL 语句(不生成结果集),则最终 SELECT return 没有结果。
- 我的连接正常。数据库服务器 运行s SQL 服务器.
- 我的块只包含一个语句 return 在数据帧中输出。
- 但是,我还需要在脚本中进行多次 SQL。我想一路创建临时 tables 并使用它们来驱动一些聚合。我想将结果保存到临时文件 table 中,并以来自临时文件 table 的单个 SELECT 语句结束,从块中生成输出。
- 我尝试将脚本保存到一个文件中,并为块使用
code
属性。那只是让我犯了一个关于最后一行不完整的错误。我不需要单独的文件。我只是想用另一种方法来解决这个问题,但我也无法做到这一点。
还没解决,一直追不到问题。也许 SQL 块甚至不支持我想让它们做的事情。有什么想法吗?
- 在 R notebook SQL 块中,是否可以 运行 多个 SQL 语句?
- 是否可以创建临时文件 table 并在同一块内的后续语句中引用它?
- 是否可以在 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;