2015-11-05 91 views
1

我有下面的代碼如預期運行不正常:保存SQL查詢的結果到本地SQL變量

DECLARE @MySelect varchar(max), @MyRecipients varchar(max), @MyId 
char(4),@MyResult varchar(max); 


SET @MyId = '1'; 
SET @MySelect = 'SELECT SQL_Script FROM AutoSendMail.dbo.A01_St WHERE 
ID =' + @MyId; 


USE msdb 
EXEC sp_send_dbmail 
@profile_name='Operator', 
@recipients='[email protected]', 
@subject='Mail test', 
@body= 'This is a test-mail', 
@mailitem_id='1', 
@query= @MyResult, 
@attach_query_result_as_file = 1 

我需要保存選擇查詢的結果是:@MySelect到變量@MyResult ,因爲我需要通過Mail發送SELECT的結果。但我找不到一個辦法做到這一點。該查詢應返回單個字符串值。

回答

0

你可以做到這一點沒有動態SQL,像這樣:

DECLARE @MyRecipients VARCHAR(MAX) , 
    @MyId CHAR(4) = '1' , 
    @MyResult VARCHAR(MAX); 


SET @MyId = '1'; 

SELECT TOP 1 
     @MyResult = SQL_Script 
FROM AutoSendMail.dbo.A01_St 
WHERE ID = @MyId 


USE msdb 
EXEC sp_send_dbmail @profile_name = 'Operator', @recipients = '[email protected]', 
    @subject = 'Mail test', @body = 'This is a test-mail', @mailitem_id = '1', 
    @query = @MyResult, @attach_query_result_as_file = 1 

不是你需要動態SQL,但是請注意,這樣做:

SET @MySelect = 'SELECT SQL_Script FROM AutoSendMail.dbo.A01_St WHERE ID =' + @MyId; 

不執行任何代碼,它只是設置的@MySelect值。您需要調用execute命令來運行SQL:

EXEC SP_EXECUTESQL @MySelect 
0

你可以聲明表變量,插入它執行查詢的結果,然後選擇到您的結果變量:

DECLARE @t TABLE(SQL_Script varchar(max)) 
INSERT INTO @t EXEC(@MySelect) 
SELECT TOP 1 @MyResult = SQL_Script FROM @t 

您還可以使用sp_executesql過程與輸出參數,如:

SET @MyId = '1'; 
SET @MySelect = 'SELECT @MyResult = SQL_Script FROM AutoSendMail.dbo.A01_St WHERE 
ID =' + @MyId; 

EXEC sp_executesql @MySelect, '@MyResult varchar(max) OUTPUT', @MyResult OUTPUT 
0

這樣怎麼樣?

select @MyResult = stuff((
          select ',' + convert(nvarchar(20), SQL_Script) 
          from AutoSendMail.dbo.A01_St 
          where ID = @MyId 
          for 
          xml path('') 
          ), 1, 1, '') 

此輸出逗號分隔的字符串,雖然