【发布时间】:2015-05-02 03:59:56
【问题描述】:
背景
我有一个显示客户独有数据的网站。每次添加新客户端时,该站点都需要创建视图。每个客户都是独一无二的,并且具有他们独有的不同识别信息。例如 ID 号和前缀。
每次添加新客户端时,都会使用标准视图集手动创建一组新视图,每次都会更改以反映客户端的唯一信息。这通常使用 SQL Server Management Studio (SSMS) 中的查找和替换来完成
到目前为止我有什么?
我创建了一个 Winform 应用程序,它捕获唯一信息并将它们放入变量中。然后将这些变量放入用于创建视图的标准脚本中。
问题
我的脚本包含的 SMSS 语句不是原生 SQL 语句,这会导致我的程序出错并在提交到数据库时中断。
有问题的语句是 SMSS 用于运行批处理的 GO关键字。
到目前为止我尝试了什么?
我已经使用 String Literal 封装了整个脚本,并按照另一个问题中的建议在 GO 语句之前和之后插入了一个新行。但它似乎不起作用。
我现在正在尝试什么?
使用 REGEX 在每次出现“GO”时拆分脚本。这也行不通。
问题
这个问题有更好的解决方案或我的解决方案吗?
代码
string connectionString = fmDbSelect();
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
connection.Open();
var scripts = Regex.Split(sql, @"^\w+GO$", RegexOptions.Multiline);
foreach (var splitScript in scripts)
{
command.CommandText = splitScript;
command.ExecuteNonQuery();
}
}
}
错误信息
{"'ANSI_NULLS' 附近的语法不正确。\r\n附近的语法不正确 'QUOTED_IDENTIFIER'。\r\n')' 附近的语法不正确。\r\n语法不正确 'ANSI_NULLS' 附近。\r\n附近有不正确的语法 'QUOTED_IDENTIFIER'。\r\n')' 附近的语法不正确。\r\n'CREATE VIEW' 必须是查询批处理中的第一条语句。\r\n附近的语法不正确 ')'。\r\n')' 附近的语法不正确。\r\n附近的语法不正确 ')'。\r\n'ANSI_NULLS' 附近的语法不正确。\r\n附近的语法不正确 “ANSI_NULLS”。\r\n关键字“AS”附近的语法不正确。\r\n不正确 关键字“AS”附近的语法。\r\n关键字附近的语法不正确 “AS”。\r\n关键字“AS”附近的语法不正确。\r\n语法不正确 关键字“AS”附近。\r\n关键字附近的语法不正确 “AS”。\r\n“ANSI_NULLS”附近的语法不正确。\r\n附近的语法不正确 ')'。\r\n'ANSI_NULLS' 附近的语法不正确。\r\n附近的语法不正确 “ANSI_NULLS”。\r\n“ANSI_NULLS”附近的语法不正确。\r\n不正确 关键字“AS”附近的语法。\r\n关键字附近的语法不正确 “AS”。\r\n“ANSI_NULLS”附近的语法不正确。\r\n附近的语法不正确 ')'。\r\n'ANSI_NULLS' 附近的语法不正确。\r\n附近的语法不正确 ')'。\r\n'ANSI_NULLS' 附近的语法不正确。\r\n附近的语法不正确 “ANSI_NULLS”。\r\n“ANSI_NULLS”附近的语法不正确。\r\n不正确 ')' 附近的语法。\r\n'ANSI_NULLS' 附近的语法不正确。\r\n不正确 关键字“AS”附近的语法。\r\n关键字附近的语法不正确 “AS”。\r\n“ANSI_NULLS”附近的语法不正确。\r\n附近的语法不正确 “ANSI_NULLS”。\r\n“ANSI_NULLS”附近的语法不正确。\r\n不正确 'ANSI_NULLS' 附近的语法。\r\n')' 附近的语法不正确。\r\n不正确 'ANSI_NULLS' 附近的语法。\r\n附近的语法不正确 “ANSI_NULLS”。\r\n关键字“AS”附近的语法不正确。\r\n不正确 关键字“LIKE”附近的语法。\r\n附近的语法不正确 'ANSI_NULLS'。"}
我的脚本
/****** 对象:查看 [dbo].[TIDEreportEmails] 脚本日期: 23/02/2015 12:43:36 ******/ 开始设置 ANSI_NULLS
SET QUOTED_IDENTIFIER ON GO
创建视图 [dbo].[TIDEreportEmails] 选择电子邮件 ID, EmailContent、EmailSubject、EmailTo、EmailFrom、UserID、ObjectValueID、 EmailSent、EmailCreated、EmailRead、EmailFromName、EmailType、 电子邮件失败, 案例 WHEN emailread 为 NULL THEN 'Not Read' ELSE 'Read' END AS EmailStatus FROM DEReportingClient2DB.dbo.Emails AS Emails_1 WHERE(用户 ID IN (选择用户 ID FROM DEReportingClient2DB.dbo.Users WHERE (ClientID = 195)))
去
/****** 对象:查看 [dbo].[TIDEunreadEmails] 脚本日期: 23/02/2015 12:43:36 ******/ 开始设置 ANSI_NULLS
SET QUOTED_IDENTIFIER ON GO
创建视图 [dbo].[TIDEunreadEmails] AS SELECT COUNT(*) AS UnreadEmails, UserID FROM dbo.TIDEreportEmails WHERE
(EmailRead 为 NULL)按用户 ID 分组
【问题讨论】:
-
这些错误的原因:
GO这不是 T-SQL 关键字。解决方案:见Remus's answer。
标签: c# sql-server regex string