2011-06-10 34 views
0

我已經完成了一些搜索,沒有什麼會提供我正在尋找的內容。我讀過關於EXEC(@variable),這可能是我想要的,但我不能得到它的工作。動態選擇語句,將結果放入變量

這個想法是,我將根據發生的事情發送電子郵件給多個組。所以我需要將這些信息存儲到一個變量中,然後我可以將它傳遞給sp_send_dbmail中的@recipients。

我爲此使用了一個很好的例子,但現在我們添加了功能,我們只是想根據他們正在工作的班次向某些用戶發送電子郵件。例如,第3班不想知道移位1發生的問題。

爲此,我建立了另一個案例來聲明基於shift的變量,並刪除了我的原始案例並創建了一個配置換班a,b,c等。所以我想要做的是

SELECT @shift FROM table WHERE location此缺陷發生的位置。

這是我正在嘗試做哪些不工作。

SET @EmailRecipients = 'SELECT' + @EmailRecipientsCase + 'FROM ScrapReasonProcessGroups WHERE ID = @ProcessCounter' 
SET @EmailRecipients = EXEC(@EmailRecipients) 

回答

1

假設您要從該查詢中取回多個電子郵件地址,您希望將這些結果存儲在臨時表中。

CREATE TABLE #tmpEmail (
    EmailAddress varchar(200) 
) 

SET @EmailSQL = 'SELECT ' + @EmailRecipientsCase + ' FROM ScrapReasonProcessGroups WHERE ID = ' + @ProcessCounter 

INSERT INTO #tmpEmail 
    (EmailAddress) 
    EXEC (@EmailSQL) 
+0

這種方法絕對是最有意義的,看起來應該可以工作。唯一的問題是它出於某種原因不喜歡這個,「必須聲明標量變量」@ProcessCounter「。 這個變量肯定已經聲明,並且一直在工作,沒有任何問題,直到我做出這個改變 – Tom 2011-06-10 14:27:33

+0

@Tom:它是如果@EmailRecipientsCase爲'1; DELETE Users - '...經典SQL注入 – gbn 2011-06-10 14:29:49

+0

讓我的代碼工作,我忽略了投射整數 SET @EmailRecipients ='SELECT'+ @ EmailRecipientsCase + 'FROM ScrapReasonProcessGroups WHERE ID =' +鑄造(@ProcessCounter爲varchar) \t \t \t \t \t \t \t \t INSERT INTO @tmpEmail(EmailAddress的) \t \t \t \t \t \t \t \t \t EXEC(@EmailRecipients)\t \t \t \t \t \t \t \t \t \t \t \t \t \t SET @EmailRecipients =(SELECT * FROM @tmpEmail) \t \t \t \t \t \t \t \t DELETE FROM @tmpEmail – Tom 2011-06-10 14:43:38

2

使用沒有動態SQL的CASE?

SELECT @EmailRecipients = CASE @EmailRecipientsCase 
           WHEN 'shifta' THEN ShiftA 
           WHEN 'shiftb' THEN ShiftB 
           WHEN 'shiftc' THEN ShiftC 
          END 
FROM ScrapReasonProcessGroups 
WHERE ID = @ProcessCounter 
+0

它確實看起來像這樣會工作......但如果這是簡單的,爲什麼不只是在查詢中刪除該CASE語句?爲什麼使它成爲一個動態查詢? – 2011-06-10 14:12:47

+0

@Philip Kelley:我的答案不是動態SQL,而是一個經典的「在SELECT中分配變量」。第一行*確實表示「使用沒有動態SQL的CASE」。 – gbn 2011-06-10 14:27:36