TSQL을 사용하여 데이터베이스를 동적으로 변경하는 방법


11

SSMS 컨텍스트를 동적 SQL에 지정된 데이터베이스로 동적으로 변경하는 데 문제가 있습니다.

EXEC sys.sp_executesql N'USE db1 ' ;

성공적으로 실행되지만 SSMS의 데이터베이스 컨텍스트는 변경되지 않습니다.

위와 같이 약간의 수정을 시도했습니다.

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql

다시 말하지만 성공적으로 실행되지만 데이터베이스는 변경되지 않습니다.


4
SSMS에서 사용중인 세션의 sp_executesql 내에서 컨텍스트를 변경할 수 없습니다. 컨텍스트는 동적 SQL 세션 중에 만 유효하며 SSMS 세션에는 유효하지 않습니다.
Lothar Kraner

답변:


7

SSMS는 반복 하지 않으며 동적 SQL에서 실행되는 사용 명령의 컨텍스트로 전환 하지 않습니다 .

최종 목표가 선택한 데이터베이스 내에서 다른 동적 SQL을 실행하는 것이라면 다음과 같이 쉽습니다.

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'SELECT DB_NAME();';

EXEC @exec @sql;

매개 변수를 전달해야하는 경우 문제가 없습니다.

DECLARE @db sysname = N'db1', @i int = 1;

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'SELECT DB_NAME(), @i;';

EXEC @exec @sql, N'@i int', @i;

선택한 데이터베이스 내에서 일부 정적 SQL 을 실행하는 것이 목표라면 각 데이터베이스의 스토어드 프로 시저에 해당 정적 SQL을 저장하고 다음과 같이 동적으로 호출하는 것을 고려해야합니다.

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'EXEC dbo.procedurename;';

EXEC @exec @sql;

그리고 궁극적으로 최종 목표는 SSMS 에서이 코드를 모두 실행하지 않는 것입니다 .SSMS가 지금의 맥락에 있습니다 @db... Daniel은 @Lothar의 의견에서도 언급했듯이 이것이 불가능하다는 것을 명시 적으로 밝히면 정말 좋아합니다.


Aaron Bertrand에게 감사합니다. 그리고 궁극적 인 목표는 SSMS에서이 코드를 모두 실행하는 것이 아니라 SSMS는 이제 @db의 맥락에 있습니다.
Mazhar

2

dynamicSQL은 실제로 코드의 나머지 부분과 별도의 엔터티로 인라인으로 실행되지는 않지만 실제로 인라인처럼 실행됩니다.

코드를 실행하면 SET @sql = N'Use ' + @db + '; select DB_NAME(); select @@spid'현재 세트의 위치에서 활성 데이터베이스를 이동했지만 여전히 동일한 연결에서 실행되고 있음을 나타내는 결과가 나타납니다.

인라인 데이터베이스 선택을 변경하려면 가장 좋은 방법은 다음과 같습니다.

IF @db = 'db1'
    USE db1
ELSE IF @db = 'db2'
    USE db2

멋지거나 깨끗하지 않고 잠재적 인 데이터베이스 당 두 줄이 필요하지만 작업을 완료합니다 (동적 SQL에서 실행하지 마십시오.

절차 / 기능에서 USE 명령을 사용하는 것은 금지되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.