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

问题描述

将表名作为参数传递给 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 分配为参数,如果我提供硬编码的表名而不是变量,它会起作用。

解决方法

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

DECLARE @sql VARCHAR(MAX)

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

它使用 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