MSSQL Management Studio - 用于使用语句

时间:2014-05-22 17:21:43

标签: sql-server

我想使用两个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语句,则第二个语句将覆盖第一个语句。

2 个答案:

答案 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' ;

the documentation

您还可以在自己的数据库中添加一个调用它的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声明,您无法使用EXECsp_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