T-SQL에서 데이터베이스 이름에 변수를 사용하는 방법은 무엇입니까?


123

스크립트의 여러 위치에서 데이터베이스 이름을 사용하고 있으며 신속하게 변경할 수 있기를 원하므로 다음과 같은 것을 찾고 있습니다.

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO

하지만 작동하지 않습니다. 그렇다면이 코드를 작성하는 올바른 방법은 무엇입니까?

답변:


135

{SERVERNAME} 자리 표시자를 사용하여 전체 스크립트를 템플릿 문자열에 넣습니다. 그런 다음 다음을 사용하여 문자열을 편집합니다.

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

다음으로 실행

EXECUTE (@SQL_SCRIPT)

3 년 동안 아무도 내 코드 가 작동하지 않는다는 것을 알아 채지 못했다는 사실을 믿기 어렵습니다 !

EXEC여러 배치를 할 수 없습니다 . GOT-SQL 문이 아니라 일괄 구분 기호입니다. 세 개의 개별 문자열을 만든 다음 EXEC대체 후 각 문자열을 만들어야합니다.

단일 템플릿 문자열을 분할하여 여러 행으로 분할하여 "영리한"작업을 수행 할 수 있다고 가정합니다 GO. ADO.NET 코드에서이 작업을 수행했습니다.

"SERVERNAME"이라는 단어는 어디서 얻었습니까?

방금 테스트 한 (그리고 작동하는) 코드는 다음과 같습니다.

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'

DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'

DECLARE @SQL_SCRIPT VARCHAR(MAX)

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

2
+1 아주 좋은 접근 방식 ... 당신은 엄청난 수의 작업에서 나를 구해주었습니다. EXECUTE (@SQL_SCRIPT)이어야하지만 적어도 그것은 저에게 효과적이었습니다.
reSPAWNed

2
하지만 탈출에주의해야합니다.
usr

4
SYSNAME가능한 모든 데이터베이스 이름을 처리 VARCHAR(255)하는 QUOTENAME데 사용해야하는 것보다 더 적절한 데이터 유형이 될 것입니다 (그리고 이름의 소스에 따라 SQL 삽입을 방지하기 위해)
Martin Smith

1
CREATE SCHEMA사용하여 다른 데이터베이스에서 원하는 경우 작동하지 않습니다 USE {DBNAME}. 스키마는 잘못된 데이터베이스 생성 /
Bomberlt

103

이를 위해 sqlcmd모드를 사용할 수도 있습니다 (Management Studio의 "쿼리"메뉴에서 활성화).

:setvar dbname "TEST" 

CREATE DATABASE $(dbname)
GO
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE 
GO

편집하다:

SQLCMD 도구를 통해 매개 변수를 설정하려면 이 MSDN 문서를 확인하십시오 .


1
이 메서드는 이미 선언 된 변수를 어떻게 사용할 수 있습니까? "TEST"대신 @dbName을 추가 할 수 있습니까? 시도했지만 작동하지 않았습니다
syclee

1
@syclee TSQL 변수? 스크립트가 서버로 전송되기 전에는 sqlcmd 대체가 수행되지 않습니다.
Martin Smith

@MartinSmith 안녕하세요 DB 이름을 OUTPUT 명령으로 원합니다. 그렇다면 SQLCMD를 사용하여 어떻게 가질 수 있습니까?
쿠날 Kakkad

12

불행히도 해당 형식의 변수를 사용하여 데이터베이스 이름을 선언 할 수 없습니다.

수행하려는 작업을 위해 EXEC () 문 내에서 문을 래핑해야합니다. 그래서 당신은 다음과 같은 것을 가질 것입니다.

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME

그런 다음 전화

EXECUTE(@Sql) or sp_executesql(@Sql)

SQL 문자열을 실행합니다.


EXEC저장 프로 시저를 찾습니다. 이 경우 EXECUTE가 필요합니다.
Bob Blogge 2013-07-18

2
사실 사과해야 겠어요. 그것은 밝혀 EXECEXECUTE동일합니다. 나는 실패 EXEC하고 성공한 후에 진술을 했다 EXECUTE. 분명히 내 진짜 문제는 어느 쪽과도 관련이 없었습니다.
Bob Blogge

2
프로덕션에서는이 작업을 수행하지 마십시오.
Magic Octopus Urn

@MagicOctopusUrn은 이전 게시물과 매우 댓글을 다양하지만 왜 안되는지 궁금합니다. 특정 요구 사항이어야하지 않습니까 ??
Harsh

@MagicOctopusUrn 주사 가능성 때문인가요?
Isaac Reefman

5

create table 문에는 변수를 사용할 수 없습니다. 내가 제안 할 수있는 가장 좋은 방법은 전체 쿼리를 문자열로 작성하고 실행하는 것입니다.

다음과 같이 시도하십시오.

declare @query varchar(max);
set @query = 'create database TEST...';

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