在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量

Posted

技术标签:

【中文标题】在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量【英文标题】:Assign query result to variable while passing table name as parameter in azure synapse stored procedure 【发布时间】:2021-06-28 18:36:58 【问题描述】:

将表名作为参数传递给 Azure Synapse 存储过程,并将查询(在 SQL 中使用传递的参数)结果分配给变量。

示例代码如下:

CREATE PROC [TEST].[DEMO_PROC] @TableName [VARCHAR](1000) AS
BEGIN
    DECLARE @count_variable INT;
    SELECT @count_variable=count(1) FROM @TableName
    PRINT @count_variable
END

错误:消息 103010,级别 16,状态 1,第 5 行 第 39 行,第 42 列的解析错误:“@TableName”附近的语法不正确。

我收到一条错误消息,说不能将 TableName 分配为参数,如果我给出硬编码的表名而不是变量,它可以工作。

【问题讨论】:

【参考方案1】:

您需要使用动态 SQL。将语句构建为变量,根据需要连接 @TableName,然后将变量传递给 EXEC:

DECLARE @sql VARCHAR(MAX)

IF OBJECT_ID(@TableName) IS NOT NULL
BEGIN
    SET @sql = 'DROP TABLE ' + @TableName;
    EXEC(@sql)
END

【讨论】:

但是如何将动态查询的结果分配给 azure synapse 存储过程中的变量。对于 ex 在我的情况下,@count_variable 应该具有动态查询的计数结果。【参考方案2】:

它通过使用 sp_executesql 工作: 以下是正在运行的更改后的 SP。

CREATE PROC [TEST].[DEMO_PROC] @TableName VARCHAR AS 
BEGIN 

DECLARE @SQLString NVARCHAR(500);  
DECLARE @ParmDefinition NVARCHAR(500);  
DECLARE @count_variable INT;

SET @SQLString = 'SELECT @count_variable = count(1)   FROM '+@TableName ;  
SET @ParmDefinition = '@count_variable INT OUTPUT';  
EXECUTE sp_executesql @SQLString, @ParmDefinition,  @count_variable=@count_variable OUTPUT;  

PRINT @count_variable;

END

【讨论】:

以上是关于在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

将 Parquet 文件从 Azure 数据湖存储帐户复制到 Synapse 数据仓库表失败

在 Azure Synapse 中将 .parquet 文件 varchar 列转换为日期时间

Azure Synapse Polybase/外部表 - 仅返回最新文件

在 Azure Synapse 中并行作业运行期间避免重复

Azure Synapse Analysis 开箱 Blog - 伍 -- Data Factory Data Pipeline Automation

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?