Sql-Server

如何使靈活的服務代理在儲存的 sql 過程中接收,如何將“FROM”參數傳遞給接收

  • April 1, 2013

前段時間我問了一個關於如何使開始對話框和發送更靈活的問題,以便它可以嵌入到將 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 可能會啟動太多的內部啟動過程)。考慮在接收端使用單個服務和隊列。即使需要多個服務(無論出於何種原因),它們也可以合併到一個隊列中。

引用自:https://dba.stackexchange.com/questions/19152