问题描述
将表名作为参数传递给 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