Назначьте результат запроса переменной при передаче имени таблицы в качестве параметра в хранимой процедуре Azure Synapse

Передача имени таблицы в качестве параметра хранимой процедуре 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

ОШИБКА: Msg 103010, уровень 16, состояние 1, строка 5 Ошибка синтаксического анализа в строке: 39, столбец: 42: неправильный синтаксис рядом с '@TableName'.

Я получаю сообщение об ошибке, в котором говорится, что TableName не может быть назначен в качестве параметра. Если я укажу жестко запрограммированное имя таблицы вместо переменной, она будет работать.


person narayana kandukuri    schedule 01.04.2021    source источник


Ответы (2)


Вам нужно будет использовать динамический SQL. Создайте оператор как переменную, при необходимости объединив @TableName, а затем передайте переменную в EXEC:

DECLARE @sql VARCHAR(MAX)

IF OBJECT_ID(@TableName) IS NOT NULL
BEGIN
    SET @sql = 'DROP TABLE ' + @TableName;
    EXEC(@sql)
END
person Joel Cochran    schedule 01.04.2021
comment
Но как присвоить результат динамического запроса переменной в хранимой процедуре синапса Azure. например, в моем случае @count_variable должен иметь результат подсчета динамического запроса. - person narayana kandukuri; 02.04.2021

Он работает с использованием 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
person narayana kandukuri    schedule 01.04.2021