2009-06-18 3 views
3

Microsoft.SqlServer.Management.Smo.Scripter 개체를 사용하여 색인/제약 조건을 포함하여 데이터베이스의 각 테이블에 대한 스크립트를 생성합니다. 이 스크립트를 생성 할 때, 그러나, 기본값으로 설정되어, 그들은 예를 들어, 기본 값에도 불구하고, 기본 키 제약 조건의 WITH 절에서SQL Server 2005에서 테이블 인덱스 스크립팅시 관계형 인덱스 옵션 제거

CREATE TABLE [dbo].[AgeGroup](
    [AgeGroupID] [int] NOT NULL), 
CONSTRAINT [PK_AgeGroup] PRIMARY KEY CLUSTERED 
(
    [AgeGroupID] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 

모든 옵션을 모든 인덱스 옵션이 포함되어 있습니다 (적어도 SQL Server 온라인 설명서에 따르면). Scripter 객체를 으로 가져 오지 않으려면에서 출력 옵션을 사용할 수 있습니까?

Server server = new Server("MYSERVER"); 

Scripter scripter = new Scripter(server); 
scripter.Options.Indexes = true; 
scripter.Options.AnsiPadding = true; 
scripter.Options.AnsiFile = true; 
scripter.Options.Permissions = true; 
scripter.Options.ClusteredIndexes = true; 
scripter.Options.DriAll = true; 

Urn[] urns = new Urn[1]; 

Table t = server.Databases["MYDATABASE"].Tables["AgeGroup"]; 
urns[0] = t.Urn; 

StringCollection sc = scripter.Script(urns); 

using (StreamWriter sw = File.CreateText("AgeGroup.Table.sql")) 
    foreach (string str in sc) 
     sw.WriteLine(str); 

답변

3

은 분명히, 그것을 제어 할 스크립팅 옵션이 없습니다 :

여기 내 코드입니다. SMO에는 더 많은 것들이 있습니다. 대부분의 사람들이 알고있는 것보다 스크립트를 쓰는 (즉, 제어되지 않음) 것이 있습니다. 예를 들어 SSMS가 개체 퀵 - 메뉴 수정 항목에 대해 수행하는 경우에도 CREATES 대신 ALTER 명령을 스크립팅 할 수있는 옵션이 없습니다.

내가 본이 사례의 대부분에서, 코드를 스캔하여 발견 된 코드에서이를 처리하는 것이 상당히 쉬운 것으로 밝혀졌습니다. 스크립터는 출력 포맷이 매우 엄격하므로 RegEx가이 작업을 수행 할 필요가 전혀 없었습니다. 그래서, 테이블 객체에 대한 CREATE 스크립트를 가지고있을 때 "WITH (PAD_INDEX) ON"을 검색하고 "ON"으로 바꾸십시오 (와일드 카드가 줄 바꿈을 통과하는지 확인하십시오).

+0

이것은 내가 종료 된 접근 방식이다 내가 너의 대답을보기 전에 걸릴. 잘 작동하고 있습니다. –

1

이를 사용하여 거의 당신이 원하는 것을 얻을 수 있습니다

개인 정적 스크립터 CreateScripter (Server 서버)

{ 
    Scripter returnValue = new Scripter(server); 
    returnValue.Options.TargetServerVersion = SqlServerVersion.Version90; 
    returnValue.Options.TargetDatabaseEngineType = DatabaseEngineType.SqlAzureDatabase; 
    returnValue.Options.NoTablePartitioningSchemes = true; 
    returnValue.Options.NoFileGroup = true; 
    return returnValue; 
} 

결과는 다음과 같습니다

CREATE TABLE [dbo].[CacheData](
    [LastFileSystemUpdate] [uniqueidentifier] NOT NULL, 
CONSTRAINT [PK_CacheData] PRIMARY KEY CLUSTERED 
(
    [LastFileSystemUpdate] ASC 
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) 
)