Как мне объявить переменную в @body для SQL Server? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь отправить электронное письмо через SQL Server.Все работает, однако я не могу заставить @body принять переменные, которые я объявляю.

Я также попытался вызвать новую переменную и установить ее на @body, но я столкнулся с той же проблемой.

Declare @Body varchar(max),    
      @TableHead varchar(max),
      @TableTail varchar(max),
      @message as varchar(max)     

Set @message=
    (

    DECLARE @CNT as int, @SLS as NVARCHAR(10)
    select  [employeeid], [Sales]
    into #loctempemployee from tblEmployees  

    Set @CNT =  (Select COUNT (Distinct EmployeeID) from #loctempemployee)

    SELECT tr.Principal As [TD], tr.[Company Name] As [TD], ai.[Action Item] As [TD], ai.Owners As [TD], ai.[Due Date] As [TD], ai.Updated As [TD]
    FROM [tblActionItem] ai
    INNER JOIN tblTripReport tr ON ai.TripReportID = tr.tripreportID
    INNER JOIN tblCustomers cu ON cu.CustomerID = tr.[Customer ID]
    INNER JOIN tblEmployees em ON em.EmployeeID = cu.EmployeeID
    WHERE em.Sales = (Select sales from #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee))
    For XML raw('tr'), Elements

    Delete #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee) 
    set @CNT = @CNT -1;

    End

    drop table #loctempemployee 
)

Select @Body = (@message)

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Если я правильно вас понимаю, вы пытаетесь присвоить результат SELECT @message. Синтаксис, который вы используете, неверен. Вы не можете запустить пакет операторов внутри SET, как в TSQL. Вы можете назначить @message результаты запроса, если ваш запрос дает строковый результат. Поэтому я думаю, что вы, вероятно, захотите изменить свой код на что-то вроде этого (исключив другие операторы из вашего SET оператора).

Declare @Body varchar(max),    
      @TableHead varchar(max),
      @TableTail varchar(max),
      @message as varchar(max);     


    DECLARE @CNT as int, @SLS as NVARCHAR(10);
    select  [employeeid], [Sales]
    into #loctempemployee from tblEmployees;  

    Set @CNT =  (Select COUNT (Distinct EmployeeID) from #loctempemployee);

Set @message=
    (
    SELECT tr.Principal As [TD], tr.[Company Name] As [TD], ai.[Action Item] As [TD], ai.Owners As [TD], ai.[Due Date] As [TD], ai.Updated As [TD]
    FROM [tblActionItem] ai
    INNER JOIN tblTripReport tr ON ai.TripReportID = tr.tripreportID
    INNER JOIN tblCustomers cu ON cu.CustomerID = tr.[Customer ID]
    INNER JOIN tblEmployees em ON em.EmployeeID = cu.EmployeeID
    WHERE em.Sales = (Select sales from #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee))
    For XML raw('tr'), Elements
    );


Delete #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee); 
    set @CNT = @CNT -1;

drop table #loctempemployee; 

Select @Body = (@message);

Кроме того, вы делаете это в цикле, который вы не показываете? Существует END, у которого нет соответствующего BEGIN, и это также объясняет строку set @CNT = @CNT -1;.

0 голосов
/ 21 января 2019

комментарии вполне корректны - вы не можете выполнить огромный блок SQL в присваивании переменной одному типу данных.

Если вы получаете нужные данные в таблицу #temp, вы можете использовать что-то вроде следующего.

    DECLARE @xml VARCHAR(MAX);
    SET @xml = CAST(( SELECT [col1] AS 'td','',[col2] AS 'td','', [col3] AS 'td'
    FROM #temptable 
    FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

    SET @body ='<html><body><H3>(Report Title)</H3>
    <table border = 1> 
    <tr>
    <th> Col1 </th> <th> Col2 </th> <th> Col3 </th>'    

    SET @body = @body + @xml + '</table></body></html>'

    -- mail out contents 
    EXEC msdb.dbo.sp_send_dbmail @recipients = @emailaddress,
                                    @body = @body,
                                    @body_format = 'HTML',
                                    @subject = 'SomeReport',
                                    @profile_name = 'SomeProfileName';
...