Как написать сценарий выполнения AS в хранимой процедуре в выделенном пуле Azure Synapse?
Я пытаюсь создать хранимую процедуру в выделенном пуле Azure Synapse, но сталкиваюсь с ошибкой. Я мало знаю об ограничениях Transact-SQL и Synapse, поэтому я не могу отлаживать реальную проблему здесь. Эта хранимая процедура является частью образца базы данных AdventureWorks2019 от Microsoft, и имя хранимой процедуры — HumanResources.uspUpdateEmployeeLogin.
Сценарий создания SP в SSMS:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [HumanResources].[uspUpdateEmployeeLogin]
@BusinessEntityID [int],
@OrganizationNode [hierarchyid],
@LoginID [nvarchar](256),
@JobTitle [nvarchar](50),
@HireDate [datetime],
@CurrentFlag [dbo].[Flag]
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
UPDATE [HumanResources].[Employee]
SET [OrganizationNode] = @OrganizationNode
,[LoginID] = @LoginID
,[JobTitle] = @JobTitle
,[HireDate] = @HireDate
,[CurrentFlag] = @CurrentFlag
WHERE [BusinessEntityID] = @BusinessEntityID;
END TRY
BEGIN CATCH
EXECUTE [dbo].[uspLogError];
END CATCH;
END;
GO
Я пытаюсь запустить этот код с некоторыми изменениями в типах данных, которые не поддерживаются в синапсе.SQL-скрипт в Synapse:
CREATE PROCEDURE [HumanResources].[uspUpdateEmployeeLogin]
@BusinessEntityID [int],
@OrganizationNode [nvarchar](100),
@LoginID [nvarchar](256),
@JobTitle [nvarchar](50),
@HireDate [datetime],
@CurrentFlag [bit]
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
UPDATE [HumanResources].[Employee]
SET [OrganizationNode] = @OrganizationNode
,[LoginID] = @LoginID
,[JobTitle] = @JobTitle
,[HireDate] = @HireDate
,[CurrentFlag] = @CurrentFlag
WHERE [BusinessEntityID] = @BusinessEntityID;
END TRY
BEGIN CATCH
EXECUTE [dbo].[uspLogError];
END CATCH;
END;
Ошибка, которую я получаю:
Parse error at line: 10, column: 1: Incorrect syntax near 'WITH'.
1 ответ
Synapse не поддерживает там предложение WITH (как отмечено его исключением в синтаксисе). Нужно ли вам использовать WITH EXECUTE AS CALLER? Вы пробовали просто удалить пункт?
EXECUTE AS CALLER в любом случае используется по умолчанию для хранимых процедур SQL Server, а Synapse не поддерживает никакой другой стиль.
CREATE { PROC | PROCEDURE } [ schema_name.] procedure_name
[ { @parameter data_type } [ OUT | OUTPUT ] ] [ ,...n ]
AS
{
[ BEGIN ] sql_statement [;][ ,...n ] [ END ]
}
[;]