2015-11-05 71 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, '') 

此输出逗号分隔的字符串,虽然