从脚本

时间:2016-06-10 06:36:04

标签: c# sql-server ado.net sqlcommand

我正在开发一个多租户应用程序,所以我需要为每个新客户端的代码创建数据库。我从SSMS“生成脚本”实用程序生成了我的模式脚本,然后我尝试了以下内容:

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

这只是脚本的一部分。实际上,我有100多个表,每个表都有超过50列。

现在当我使用上面写的C#代码时,它给了我以下异常:

  

关键字“USE”附近的语法不正确。数据库'databaseName'没有   存在。确保正确输入名称。

但是当我从Visual Studio中的文本可视化工具获取脚本并在SSMS中执行它时,它会成功运行并创建新的数据库名称。

我做错了什么?请帮忙。

1 个答案:

答案 0 :(得分:3)

GO不是T-SQL中的合法命令。

此命令由编辑脚本的任何程序(如SQL Server Management Studio)处理,并用作分隔符以将大查询分成多个较小的查询。

您无法将GO命令发送到SQL Server,否则您将收到该错误。

所以基本上你应该使用GO命令来分隔你的查询,并且一次只执行一次中间的位。

以下是documentation of GO (Transact-SQL)

  

GO不是Transact-SQL语句;它是sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器识别的命令。