如何使靈活的服務代理在儲存的 sql 過程中接收,如何將“FROM”參數傳遞給接收
前段時間我問了一個關於如何使開始對話框和發送更靈活的問題,以便它可以嵌入到將 to、from 參數作為 sysname 變數的過程中。
多個發起者將使用服務代理程序開始對話對話..如何將參數傳遞給它
但是,正如 Rusanu 在答案中提到的,這種相同的技術不能用於 Receive 的 From 子句。
實際上它會起作用。大多數 SSB 動詞都接受參數作為參數(當然,除了 RECEIVE 的隊列名稱)。參數的類型為 sysname …
實際上發送端已經完成,我現在正試圖以同樣的方式使接收靈活,例如:
CREATE PROCEDURE QueueReceive @myTargetQueue SYSNAME @cg UNIQUEIDENTIFIER OUTPUT @ch UNIQUEIDENTIFIER OUTPUT @msg XML OUTPUT as BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @cg = conversation_group_id, @msg = cast(message_body as XML), @ch= conversation_handle FROM @myTargetQueue ), TIMEOUT 3000; COMMIT ...
似乎 sysname 類型的變數不能在 RECEIVE 的 from 子句中使用?如果我必須在動態 SQL 中執行此操作,我將如何從接收函式的動態 sql 執行中返回所有變數、conversation_group_id、conversation_handle 等?有沒有更好的技術來完成同樣的事情?
謝謝你。
FIX/Update SO FAR:我正在創建一堆 IF 子句,具體取決於傳遞的參數是什麼,它只會執行不同的整個接收語句。它效率不高,因為每次添加新隊列時我都必須更改過程程式碼,但我想現在就可以了…
因為 RECEIVE 基本上是一個 DELETE 並且因此有一個查詢計劃,所以它必須遵守 SELECT/INSERT/DELETE/UPDATE 語句具有的相同限制,特別是它所作用的對象必須在編譯時知道的限制,而不是在執行時.
唯一的選擇是使用動態 SQL,隨之而來的是所有的祝福和陷阱。
您還可以在項目部署期間生成過程主體,擁有一個模板並為每個隊列生成一個特定的過程,專門用於特定的隊列名稱。這是否可行取決於許多因素,首先取決於項目的組織和部署方式。
在旁注中,我很驚訝聽到你有很多隊列。一般來說,趨勢是有一個隊列和幾個隊列讀取器(已啟動程序)。由於 SSB 程式是事件驅動的(等待消息、處理消息、等待消息、處理消息、等待消息…),因此擁有多個隊列來等待消息變得更加困難,因為應用程序現在必須等待在多個源上(例如,每個隊列至少一個執行緒)。即使使用 SSB 啟動(這減輕了顯式等待的需要,因為它會啟動程式碼以按需處理消息),多個隊列也更難管理(每個隊列的 max_queue_readers 可能會啟動太多的內部啟動過程)。考慮在接收端使用單個服務和隊列。即使需要多個服務(無論出於何種原因),它們也可以合併到一個隊列中。