適用於:Azure Logic Apps (使用量 + 標準)
若要更輕鬆地將使用 SQL 資料庫的商務工作自動化,您的工作流程可以使用 SQL Server 連接器作業,這為工作流程提供許多後端功能,以在 Azure Logic Apps 中使用。
在某些情況下,您的工作流程可能必須處理大型結果集。 這些結果集可能太大,以至於 SQL Server 連接器作業不會同時傳回所有結果。 在其他情況下,您可能只想要對結果集的大小和結構進行更多控制。 若要以您想要的方式組織結果,您可以建立 預存程序。
例如,當 SQL Server 連接器動作取得或插入多個資料列時,您的工作流程可以使用在這些限制內運作的 Until 迴圈來逐一查看這些資料列。 如果您的工作流程必須處理數千或數百萬個資料列,您想要將 SQL Server 連接器動作呼叫對 SQL 資料庫所產生的成本降到最低。 如需詳細資訊,請參閱 使用 SQL 連接器處理大量資料。
本指南說明如何使用 SQL Server 連接器動作處理大型結果集時,控制大小、結構和逾時。
預存程序執行的逾時限制
SQL Server 連接器具有 [執行預存程序] 動作,逾時限制少於兩分鐘。 某些預存程序可能需要超過此限制的時間才能完成,這會導致 504 逾時 錯誤。 有時,長時間執行的進程會明確地編碼為預存程序,以達到此目的。 由於逾時限制,從 Azure Logic Apps 呼叫這類程式可能會產生問題。
SQL Server 連接器作業本身不支援非同步模式。 若要解決此限制,請使用下列項目來模擬此模式:
- SQL 完成觸發器
- 原生 SQL 傳遞查詢
- 狀態表
- 伺服器端作業
例如,假設您有以下執行時間較長的儲存程序。 若要完成執行,程序會超出逾時限制。 如果您使用名為 [執行預存程序] 的 SQL Server 連接器動作從工作流程執行此預存程序,您會收到 HTTP 504 閘道逾時錯誤。
CREATE PROCEDURE [dbo].[WaitForIt]
@delay char(8) = '00:03:00'
AS
BEGIN
SET NOCOUNT ON;
WAITFOR DELAY @delay
END
您可以使用 工作代理程式在背景非同步執行程序,而不是直接呼叫預存程序。 您可以將輸入和輸出儲存在狀態表中,然後可以透過工作流程存取和管理該表。 如果您不需要輸入和輸出,或者您已經將結果寫入預存程序中的資料表,您可以簡化此方法。
這很重要
請確定您的預存程序和所有作業都是 冪等的,這表示它們可以執行多次而不會影響結果。 如果非同步處理失敗或逾時,工作代理程式可能會多次重新嘗試執行預存程序。 在建立任何物件並避免重複輸出之前,請參閱這些 最佳實務和方法。
若要使用雲端式 SQL Server 的作業代理程式在背景非同步執行程式,請遵循步驟來 建立和使用適用於 Azure SQL 資料庫的 Azure 彈性作業代理程式。
針對內部部署 SQL Server 和 Azure SQL 受控執行個體,請 改為建立並使用 SQL Server 代理程式 。 基本步驟與設定 Azure SQL 資料庫的作業代理程式相同。
建立 Azure SQL 資料庫的作業代理程式
若要建立可執行 Azure SQL 資料庫預存程序的作業代理程式,請建立並使用 Azure 彈性作業代理程式。 不過,在建立此作業代理程式之前,您必須先設定許可權、群組和目標,如 Azure 彈性作業代理程式檔中所述。 您也必須在目標資料庫中建立支援狀態資料表,如下列各節所述。
若要建立作業代理程式,請在 Azure 入口網站 中執行此工作。 此方法會將數個預存程序新增至代理程式所使用的資料庫,也稱為 代理程式資料庫。 然後,您可以建立工作代理程式,在目標資料庫中執行預存程序,並在完成後擷取輸出。
建立狀態表以註冊參數和儲存輸入
SQL 代理程式作業不接受輸入參數。 相反地,在目標資料庫中,建立狀態資料表,您可以在其中註冊參數,並儲存用於呼叫預存程序的輸入。 所有代理程式工作步驟都會針對目標資料庫執行,但工作的預存程序會針對代理程式資料庫執行。
若要建立狀態表,請使用下列結構描述:
CREATE TABLE [dbo].[LongRunningState](
[jobid] [uniqueidentifier] NOT NULL,
[rowversion] [timestamp] NULL,
[parameters] [nvarchar](max) NULL,
[start] [datetimeoffset](7) NULL,
[complete] [datetimeoffset](7) NULL,
[code] [int] NULL,
[result] [nvarchar](max) NULL,
CONSTRAINT [PK_LongRunningState] PRIMARY KEY CLUSTERED
( [jobid] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
以下是產生的資料表在 SQL Server Management Studio (SMSS) 中的外觀:
為了確保良好的效能,並確保工作代理程式可以找到相關聯的記錄,表格會使用工作執行 ID (jobid) 作為主索引鍵。 如有需要,您也可以為輸入參數新增個別資料行。 先前描述的架構可以更加全面地處理多個參數,但僅限於由 NVARCHAR(MAX) 函數決定的尺寸。
建立執行預存程序的最上層作業
若要執行長時間執行的預存程序,請在代理程式資料庫中建立此最上層工作代理程式:
EXEC jobs.sp_add_job
@job_name='LongRunningJob',
@description='Execute Long-Running Stored Proc',
@enabled = 1
將參數化、執行及完成預存程序的步驟新增至作業。 依預設,作業的步驟會在 12 小時後逾時。 如果您的預存程序需要更多時間,或您希望程序早點逾時,您可以將 step_timeout_seconds 參數變更為另一個以秒為單位指定的值。 依預設,一個步驟內建 10 次重試,每次重試之間都有輪詢逾時,您可以加以利用。
以下是添加的步驟:
等待參數出現在表格中
LongRunningState。第一個步驟會等待參數新增至表格中
LongRunningState,這會在工作啟動後不久發生。 如果作業執行 ID (jobid)未被新增至LongRunningState資料表,步驟即會失敗。 預設重試或輪詢逾時會負責處理等待:EXEC jobs.sp_add_jobstep @job_name='LongRunningJob', @step_name= 'Parameterize WaitForIt', @step_timeout_seconds = 30, @command= N' IF NOT EXISTS(SELECT [jobid] FROM [dbo].[LongRunningState] WHERE jobid = $(job_execution_id)) THROW 50400, ''Failed to locate call parameters (Step1)'', 1', @credential_name='JobRun', @target_group_name='DatabaseGroupLongRunning'從狀態表查詢參數,並將其傳遞至預存程序。 此步驟也會在背景執行程式。
如果您的預存程序不需要參數,請直接呼叫預存程序。 否則,若要傳遞
@timespan參數,請使用@callparams,您也可以擴充該參數以傳遞更多參數。EXEC jobs.sp_add_jobstep @job_name='LongRunningJob', @step_name='Execute WaitForIt', @command=N' DECLARE @timespan char(8) DECLARE @callparams NVARCHAR(MAX) SELECT @callparams = [parameters] FROM [dbo].[LongRunningState] WHERE jobid = $(job_execution_id) SET @timespan = @callparams EXECUTE [dbo].[WaitForIt] @delay = @timespan', @credential_name='JobRun', @target_group_name='DatabaseGroupLongRunning'完成工作並記錄結果。
EXEC jobs.sp_add_jobstep @job_name='LongRunningJob', @step_name='Complete WaitForIt', @command=N' UPDATE [dbo].[LongRunningState] SET [complete] = GETUTCDATE(), [code] = 200, [result] = ''Success'' WHERE jobid = $(job_execution_id)', @credential_name='JobRun', @target_group_name='DatabaseGroupLongRunning'
啟動作業並傳遞參數
若要啟動工作,請使用傳遞原生查詢搭配執行 SQL 查詢 動作 ,並立即將工作的參數推送至狀態表格。 為將輸入提供至目標資料表中的 jobid 屬性,Azure Logic Apps 會新增 For each 迴圈,逐一查看來自前一個動作的資料表輸出。 針對每個工作執行 ID,執行 [插入資料列] 動作,該動作會使用名為 ResultSets JobExecutionId 的動態資料輸出來新增要解壓縮並傳遞至目標預存程序的工作參數。
當工作完成時,工作會更新 LongRunningState 表格。 從不同的工作流程中,您可以使用名為當項目被修改時的觸發來觸發結果。 如果您不需要輸出,或者您已經有監控輸出表的觸發器,則可以略過此部分。
建立 SQL Server 或 Azure SQL 受控執行個體的作業代理程式
針對 內部部署 SQL Server 和 Azure SQL 受控執行個體,請建立並使用 SQL Server 代理程式。 相較於 Azure SQL 資料庫的雲端式作業代理程式,某些管理詳細資料會有所不同,但基本步驟會保持不變。