Sql server MSSQL管理工作室-用于使用语句

Sql server MSSQL管理工作室-用于使用语句,sql-server,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

我想使用两个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\u send\u dbmail
的唯一方法是使用
use msdb
命令。但是,如果我使用两个
use
语句,则第二个语句将覆盖第一个语句。

在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
来更改当前连接的数据库,因为它们是在不同的上下文中执行的。例如,这会产生稍微令人惊讶的结果:

use master
exec ('use msdb')
print db_name()  -- outputs 'master'
exec sp_executeSql N'use msdb;'
print db_name()  -- outputs 'master'

在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
来更改当前连接的数据库,因为它们是在不同的上下文中执行的。例如,这会产生稍微令人惊讶的结果:

use master
exec ('use msdb')
print db_name()  -- outputs 'master'
exec sp_executeSql N'use msdb;'
print db_name()  -- outputs 'master'

在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
来更改当前连接的数据库,因为它们是在不同的上下文中执行的。例如,这会产生稍微令人惊讶的结果:

use master
exec ('use msdb')
print db_name()  -- outputs 'master'
exec sp_executeSql N'use msdb;'
print db_name()  -- outputs 'master'

在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
来更改当前连接的数据库,因为它们是在不同的上下文中执行的。例如,这会产生稍微令人惊讶的结果:

use master
exec ('use msdb')
print db_name()  -- outputs 'master'
exec sp_executeSql N'use msdb;'
print db_name()  -- outputs 'master'

不太清楚,但我猜您正在构建一个SQL语句,以使用sp_ExecuteSql执行。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
set@tsql='use@name;'+
exec sp_ExecuteSql@tsql
set@tsql='use;'+
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
set@tsql='use@name;'++';使用;'+
exec sp_ExecuteSql@tsql

不太清楚,但我猜您正在构建一个SQL语句,以便使用sp_ExecuteSql执行。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
set@tsql='use@name;'+
exec sp_ExecuteSql@tsql
set@tsql='use;'+
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
set@tsql='use@name;'++';使用;'+
exec sp_ExecuteSql@tsql

不太清楚,但我猜您正在构建一个SQL语句,以便使用sp_ExecuteSql执行。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
set@tsql='use@name;'+
exec sp_ExecuteSql@tsql
set@tsql='use;'+
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
set@tsql='use@name;'++';使用;'+
exec sp_ExecuteSql@tsql

不太清楚,但我猜您正在构建一个SQL语句,以便使用sp_ExecuteSql执行。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
set@tsql='use@name;'+
exec sp_ExecuteSql@tsql
set@tsql='use;'+
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
set@tsql='use@name;'++';使用;'+
exec sp_ExecuteSql@tsql

完全不清楚您的问题出在哪里。更好的例子,请定义“修复”。是的,以后的设置会覆盖以前的设置。这是正确的行为,那么修复它意味着什么呢?你需要
使用
,你不能将数据库名称附加到你的查询中吗?@rbaryyoung看看我的update@TomTom看看我的更新,不清楚你的问题在哪里。更好的例子,请定义“修复”。是的,以后的设置会覆盖以前的设置。这是正确的行为,那么修复它意味着什么呢?你需要
使用
,你不能将数据库名称附加到你的查询中吗?@rbaryyoung看看我的update@TomTom看看我的更新,不清楚你的问题在哪里。更好的例子,请定义“修复”。是的,以后的设置会覆盖以前的设置。这是正确的行为,那么修复它意味着什么呢?你需要
使用
,你不能将数据库名称附加到你的查询中吗?@rbaryyoung看看我的update@TomTom看看我的更新,不清楚你的问题在哪里。更好的例子,请定义“修复”。是的,以后的设置会覆盖以前的设置。这是正确的