从脚本创建数据库时,关键字 'USE' 附近的语法不正确错误
Incorrect syntax near the keyword 'USE' error while creating database from Script
我正在开发一个多租户应用程序,因此我需要为每个新客户端从代码创建数据库。我已经从 SSMS "Generate Script" 实用程序生成了我的架构脚本,然后我尝试了以下操作:
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 多个 table,每个 table 都有超过 50 列。
现在,当我使用上面编写的 C# 代码时,出现以下异常:
Incorrect syntax near the keyword 'USE'. Database 'databaseName' does not
exist. Make sure that the name is entered correctly.
但是当我从 Visual Studio 中的文本可视化工具获取脚本并在 SSMS 中执行它时,它成功运行并创建了新的数据库名称。
我做错了什么?请帮忙。
GO
不是 T-SQL.
中的合法命令
此命令由您在其中编辑脚本的任何程序处理,例如 SQL Server Management Studio,并用作分隔符将您的大查询分成多个较小的查询。
您不能将 GO
命令发送到 SQL 服务器,否则您会收到该错误。
所以基本上你应该使用 GO
命令来分隔你的查询并只执行中间的位,一次一位。
这里是 documentation of GO (Transact-SQL):
GO is not a Transact-SQL statement; it is a command recognized by the sqlcmd and osql utilities and SQL Server Management Studio Code editor.
我正在开发一个多租户应用程序,因此我需要为每个新客户端从代码创建数据库。我已经从 SSMS "Generate Script" 实用程序生成了我的架构脚本,然后我尝试了以下操作:
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 多个 table,每个 table 都有超过 50 列。
现在,当我使用上面编写的 C# 代码时,出现以下异常:
Incorrect syntax near the keyword 'USE'. Database 'databaseName' does not exist. Make sure that the name is entered correctly.
但是当我从 Visual Studio 中的文本可视化工具获取脚本并在 SSMS 中执行它时,它成功运行并创建了新的数据库名称。
我做错了什么?请帮忙。
GO
不是 T-SQL.
此命令由您在其中编辑脚本的任何程序处理,例如 SQL Server Management Studio,并用作分隔符将您的大查询分成多个较小的查询。
您不能将 GO
命令发送到 SQL 服务器,否则您会收到该错误。
所以基本上你应该使用 GO
命令来分隔你的查询并只执行中间的位,一次一位。
这里是 documentation of GO (Transact-SQL):
GO is not a Transact-SQL statement; it is a command recognized by the sqlcmd and osql utilities and SQL Server Management Studio Code editor.