我有一个返回结果集的动态存储过程.

CREATE OR ALTER PROCEDURE [test].[proc] 
    (@id INT,
     @temp_table_name VARCHAR(50) = '') 
AS
BEGIN
    SET @sql = N'SELECT * FROM test.table con';

    IF (LEFT(@temp_table_name, 2) = '##')
    BEGIN
        DECLARE @move_to_temp_sql varchar(max);

        SET @move_to_temp_sql = REPLACE(@sql, 'FROM test.table con', 'INTO ' + @temp_table_name + ' FROM test.table con');
    END

    EXECUTE(@sql)
END

当我从另一个存储过程调用存储过程时,我传递的是临时表的名称.

[test].[proc] 1, '##test'

我想要从调用存储过程访问全局临时表##test,如下所示:

SELECT * FROM ##test;

我得到

无效的对象名称‘##test’

当我try 这个的时候.

请注意:表的 struct 会有所不同,因此我不能在调用存储过程中定义临时表,它必须在动态存储过程中定义.

推荐答案

您的存储过程从未创建您想要创建的临时表,而只是从test.table中 Select 记录.这就是为什么你找不到临时表的原因.

您需要使用EXECUTE(@move_to_temp_sql)而不是EXECUTE(@sql).

此外,您还需要在存储过程中声明变量@sql.请尝尝这个.您将获得所需的临时表.

您还可以简单地

CREATE OR ALTER PROCEDURE [proc] 
    (@id INT,
     @temp_table_name VARCHAR(50) = '') 
AS
BEGIN  
    
    IF (LEFT(@temp_table_name, 2) = '##')
    BEGIN
        DECLARE @sql varchar(max);

        SET @sql = 'select * INTO ' + @temp_table_name + ' FROM test.table con';
    END

    EXECUTE(@sql)
END

Sql相关问答推荐

在postgres中动态计算出现次数并插入到json中

当交叉联接3个或更多表时,实体框架中是否会传输冗余的行数据并占用数据库带宽?

部分匹配表中元素的MariaDB查询查找结果

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

对表进行多项 Select 以返回最大值和时间

如何根据行状态设置正确的标志

我可以在SQLite3中使用BLOB作为主键吗?

每小时 Select 1行

以一致的价值获得独特的价值

如何使用聚合连接两个表

在特定条件下使用 LAG,确定要采用什么 LAG 值?

如何在 SQL Server 中解决这个复杂的窗口查询?

INSERT INTO 语法

根据行号将列转置为没有任何id或键列的行

获取 SQL Server 中每一行的两个-之间的文本

将有效数字作为 varchar 返回的 SQL 函数

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

如何在 Trino/Presto 中过滤掉 map 中的某些键?

为什么这是 AND,OR with NULL 的真值表?