2016-06-10 2 views
1

멀티 테넌트 응용 프로그램을 개발 중이므로 새로운 클라이언트마다 코드에서 데이터베이스를 만들어야합니다.스크립트에서 데이터베이스를 만들 때 'USE'키워드 근처에 구문이 잘못되었습니다.

public static void CreateIfNotExist(string path) // the path where the script for creating database is located 
{ 
    var db = System.Web.HttpContext.Current.Session["dbName"].ToString(); 
    using (var con = new SqlConnection("Data Source=.; uid=sa; pwd=password;")) 
    { 
     con.Open(); 

     var xmlStr = File.ReadAllText(path); 
     var str = XElement.Parse(xmlStr); 
     foreach (var item in str.Elements()) 
     { 
      var query = "CREATE DATABASE " + db + Environment.NewLine + "GO" + Environment.NewLine + "USE " + db + Environment.NewLine + "GO" + Environment.NewLine; 
      var scriptToRun = File.ReadAllText(item.Value); 
      query += scriptToRun; 

      SqlCommand cmd = new SqlCommand(query, con); 
      try 
      { 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
      } 
     } 

    } 
} 

그리고 내 스크립트는 다음과 같습니다 :

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING OFF 
GO 
CREATE TABLE [dbo].[ACOD](
    [id] [numeric](10, 0) NOT NULL, 
    [serial] [numeric](10, 0) NULL, 
    [name] [varchar](250) NULL, 
CONSTRAINT [PK_ACOD] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING OFF 
GO 
CREATE TABLE [dbo].[AGZH](
    [id] [numeric](10, 0) NOT NULL, 
    [number] [numeric](10, 0) NULL, 
    [date] [smalldatetime] NULL, 
    [name] [varchar](50) NULL, 
CONSTRAINT [PK_AGZH] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 

이 스크립트의 단지 부분이다 내가 유틸리티 "스크립트 생성"SSMS에서 내 스키마의 스크립트를 생성 한 후, 나는 다음 시도했다. 실제로는 모든 테이블에 100 개 이상의 테이블이 있고 50 개 이상의 컬럼이 있습니다. 키워드 '사용'근처

의 구문이 잘못되었습니다 :

지금 나는 그것이 나에게 다음과 같은 예외를했다 위에 기록 된 C# 코드를 사용하는 경우. 'databaseName'데이터베이스에 이 없습니다. 이름이 올바르게 입력되었는지 확인하십시오.

하지만 Visual Studio에서 텍스트 시각화에서 스크립트를 얻고 SSMS에서 그것을 실행하면, 그것은 성공적으로 실행하고 새 데이터베이스 이름을 만들었습니다.

내가 뭘 잘못하고 있니? 도와주세요.

답변

2

GO은 T-SQL에서 유효한 명령이 아닙니다.

이 명령은 SQL Server Management Studio와 같이 스크립트를 편집하는 프로그램이 처리하며 큰 쿼리를 여러 개의 작은 쿼리로 구분하는 구분 기호로 사용됩니다.

GO 명령을 SQL Server로 보낼 수 없거나 해당 오류가 발생합니다.

기본적으로 GO 명령을 사용하여 쿼리를 분리하고 한 번에 한 비트 씩 inbetween 비트 만 실행해야합니다. 여기

documentation of GO (Transact-SQL)입니다 :

GO는 Transact-SQL 문 아니다; sqlcmd 및 osql 유틸리티와 SQL Server Management Studio 코드 편집기에서 인식하는 명령입니다.

+0

고맙습니다. 그것은 효과가 있었다. 나는 그 명령을 분리했다. 먼저 CREATE DATABASE 명령을 실행 한 다음 나머지 명령을 다른 명령으로 실행했습니다. 또한 스크립트에서 'GO'명령을 모두 제거합니다. 감사합니다. 나는 이것으로 머리카락을 정말로 잡아 당겼다. –