2010-08-03 4 views
2

변수 값을 사용하여 데이터베이스를 만들고 싶습니다. 여기에 내 스크립트가 있지만 작동하지 않습니다. 어떤 아이디어? (이름이 사용자가 제공되는 경우, 적절한 예방 조치)변수에서 이름으로 사용하여 데이터베이스 만들기

-- Set Data Base name 
DECLARE @DataBaseName char(64); 
SET @DataBaseName = 'DbCmsWebsiteTest'; 

-- Create Data Base 
CREATE DATABASE @DataBaseName; 
GO 
+0

동적으로 데이터베이스를 만들 필요는 일반적으로 데이터베이스 설계 결함의 표시입니다 :

는 여기를 사용하는 예입니다. – HLGEM

+1

왜 데이터베이스 디자인 결함입니까? – GibboK

답변

10

당신은

-- Set Data Base name 
DECLARE @DataBaseName sysname; 
SET @DataBaseName = 'DbCmsWebsiteTest'; 

IF (@DataBaseName LIKE '%[^0-9A-Z]%') 
    RAISERROR('Invalid Characters in Name, %s',16,1,@DataBaseName) 
ELSE 
    BEGIN 
    SET @DataBaseName = QUOTENAME(@DataBaseName) 
    EXEC('CREATE DATABASE '+ @DataBaseName) 
    END 
+0

하지만 유효한 이름 규칙을 직접 확인하지 않고 CREATE를 올립니다. 예를 들어, 당신의 수표는 space,'_','-'와 같은 많은 유효한 문자를 배제합니다. –

+1

@ Remus - 동의 - 저는 SQL 주입 가능성에 대해 조금 모순되었지만 QUOTENAME이 그걸 처리 할 것 같아요. –

3

사실, 권장되는 방법은 sp_executesql 기능입니다 내 생각이 동적 SQL을 필요 했어. 물론

DECLARE @SqlCommand NVARCHAR(255), @DatabaseName NVARCHAR(63) 
SET @DatabaseName = 'DbName' 
SET @SqlCommand = N'CREATE DATABASE ' + @DatabaseName 
EXECUTE sp_executesql @SqlCommand 
+1

'@ DatabaseName'근처에'잘못된 구문을 제공합니다 .' 데이터베이스 이름에 대한 매개 변수를 허용하는 구문을 찾아야합니다 (이 경우 직접 호출 할 수있는 동적 SQL은 필요하지 않습니다). –

+0

마틴의 의견에 따르면, 'sp_executesql'은 SQL Server 2005+ 구문이며, 우리는이 버전의 SQL Server를 알지 못합니다. –

+0

알았습니다! 나는 약간의 spyexecutesql에 대한 아이디어가 가능할 때 msdn이 그것을 사용하도록 권장한다는 사실을 근거로했다. 그러나 실행 계획에있어서 가장 큰 이점은이 옵션에서 어떤 옵션이 사용되는지가 중요하지 않다고 생각합니다. – Corina

관련 문제