2014-05-22 5 views
0

두 개의 use 문을 사용하고 두 번째 문이 첫 번째 문을 재정의하므로 현재 두 개의 use 문이 작동하지 않습니다. 어떻게 수정해야합니까?MSSQL Management Studio - 문을 사용하여 사용

While exists (Select name from #db) 
    Begin 
    select @name = min(name) from #db 

    set @tsql = 'use '[email protected]+' '+ 

    'USE msdb 
     EXEC sp_send_dbmail 
     @profile_name = ''Blah blah blah'', 
     ----'  
    End 

쿼리를 실행 한 후에 문제가 발생하면 전자 메일 알림을 전자 메일 주소로 보내려고합니다. sp_send_dbmail을 사용하는 유일한 방법은 Use msdb 명령을 사용하는 것입니다. 그러나 두 개의 use 문을 사용하면 두 번째 문이 첫 번째 문을 재정의합니다.

+1

문제가있는 곳이 전혀 명확하지 않습니다. 더 나은 예를 들어주세요. – TomTom

+0

"수정"을 정의하십시오. 예, 나중에 설정이 이전 설정보다 우선합니다. 그게 올바른 행동입니다. 그래서 * 고치는 것은 무엇을 의미합니까? – RBarryYoung

+0

'USE'가 필요합니까? 쿼리에 데이터베이스 이름을 추가 할 수 없습니까? – Lamak

답변

3

EXEC 명령문에서 데이터베이스 이름을 지정하십시오.

EXEC msdb.dbo.sp_send_dbmail 
    @profile_name = 'Adventure Works Administrator', 
    @recipients = '[email protected]', 
    @body = 'The stored procedure finished successfully.', 
    @subject = 'Automated Success Message' ; 

the documentation을 참조하십시오.

호출자가 dbmail 프로필 등의 이름을 알 필요가 없도록 호출하는 자신의 db에 proc를 추가 할 수도 있습니다.

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' 
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 

을 또는이 경우 어떤 이유에서든 작동 sp_executesql에 두 번 당신을 위해 부담이 너무 많이 :

set @tsql = 'use @name; ' + <do some code here> + '; use <some other db>; ' + <do some other code here> 

exec sp_ExecuteSql @tsql