我想使用两个use语句,而我当前的两个use语句将不起作用,因为第二个语句将覆盖第一个语句。我该如何解决?
While exists (Select name from #db)
Begin
select @name = min(name) from #db
set @tsql = 'use '+@name+' '+
'USE msdb
EXEC sp_send_dbmail
@profile_name = ''Blah blah blah'',
----'
End
我希望在运行查询后发生某些事情时向电子邮件地址发送电子邮件通知。我看到使用sp_send_dbmail
的唯一方法是使用Use msdb
命令。但是,如果我使用两个use
语句,则第二个语句将覆盖第一个语句。
答案 0 :(得分:3)
在EXEC语句中指定数据库名称,例如
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Adventure Works Administrator',
@recipients = 'danw@Adventure-Works.com',
@body = 'The stored procedure finished successfully.',
@subject = 'Automated Success Message' ;
您还可以在自己的数据库中添加一个调用它的proc,这样调用者就不需要知道dbmail配置文件的名称等。
create proc dbo.usp_send_email
@recipients nvarchar(max)
, @body nvarchar(max)
, @subject nvarchar(max)
as
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Your Standard Profile',
@recipients = @recipients,
@body = @body,
@subject = @subject;
go
以上显示您不需要使用USE
。但是出于兴趣,关于USE
声明,您无法使用EXEC
或sp_executeSql
来更改当前连接的数据库,因为它们是&#39 ;在不同的背景下执行。因此,例如,这给出了一些令人惊讶的输出:
use master
exec ('use msdb')
print db_name() -- outputs 'master'
exec sp_executeSql N'use msdb;'
print db_name() -- outputs 'master'
答案 1 :(得分:0)
目前还不是很清楚,但我猜你正在构建一个使用sp_ExecuteSql执行的SQL语句。并且SQL语句需要在不同的数据库上运行。
嗯,你可以这样做:
set @tsql = 'use @name; ' + <do some code here>
exec sp_ExecuteSql @tsql
set @tsql = 'use <some other db>; ' + <do some other code here>
exec sp_ExecuteSql @tsql
或者甚至可以这样做,如果出于某种原因,两次调用exec sp_ExecuteSql对你来说太沉重了:
set @tsql = 'use @name; ' + <do some code here> + '; use <some other db>; ' + <do some other code here>
exec sp_ExecuteSql @tsql