2011-06-10 72 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