背景
我有一个网站,显示客户独有的数据。网站要求在添加新客户端时创建视图。每个客户机都是唯一的,并且具有不同的唯一标识信息。例如,一个id号和一个前缀。
每次添加新客户机时,都会使用标准视图集手动创建一组新视图,该视图集每次都会更改以反映客户机的唯一信息。这通常使用sqlservermanagementstudio(ssms)中的find和replace完成。
到目前为止我有什么?
我已经创建了一个winform应用程序,它捕获唯一的信息并将它们放入变量中。然后将这些变量放入用于创建视图的标准脚本中。
问题
我的脚本包含的smss语句不是本机sql语句,这会导致我的程序出错并中断其对数据库的提交。
所讨论的语句是用于SMS运行批处理的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附近的语法不正确
'带引号的'u标识符'。\r\n在')'附近的语法不正确。\r\n语法不正确
“ansi\u nulls”附近。\r\n附近的语法不正确
'引用的'u标识符'。\r\n')附近的语法不正确。\r\n'创建视图'
必须是查询批处理中的第一个语句。\r\n附近的语法不正确
“)”。\r\n在“)”附近语法不正确。\r\n在“)”附近语法不正确
“)”。\r\n在“ansi-nulls”附近语法不正确。\r\n在“ansi-nulls”附近语法不正确
'ansi\u nulls'。\r\n关键字'as'附近的语法不正确。\r\n不正确
关键字“as”附近的语法。\r\n关键字附近的语法不正确
'as'。\r\n关键字'as'附近的语法不正确。\r\n语法不正确
在关键字“as”附近。\r\n该关键字附近的语法不正确
'as'.\r\n在'ansi'u nulls'附近语法不正确。\r\n在'ansi'u nulls'附近语法不正确
“)”。\r\n在“ansi-nulls”附近语法不正确。\r\n在“ansi-nulls”附近语法不正确
'ansi_nulls'。\r\n在'ansi_nulls'附近的语法不正确。\r\n不正确
关键字“as”附近的语法。\r\n关键字附近的语法不正确
'as'.\r\n在'ansi'u nulls'附近语法不正确。\r\n在'ansi'u nulls'附近语法不正确
“)”。\r\n在“ansi-nulls”附近语法不正确。\r\n在“ansi-nulls”附近语法不正确
“)”。\r\n在“ansi-nulls”附近语法不正确。\r\n在“ansi-nulls”附近语法不正确
'ansi_nulls'。\r\n在'ansi_nulls'附近的语法不正确。\r\n不正确
语法靠近“)”。\r\n在“ansi-nulls”附近语法不正确。\r\n不正确
关键字“as”附近的语法。\r\n关键字附近的语法不正确
'as'.\r\n在'ansi'u nulls'附近语法不正确。\r\n在'ansi'u nulls'附近语法不正确
'ansi_nulls'。\r\n在'ansi_nulls'附近的语法不正确。\r\n不正确
“ansi\u nulls”附近的语法。\r\n在“)”附近的语法不正确。\r\n不正确
“ansi\u nulls”附近的语法。\r\n附近的语法不正确
'ansi\u nulls'。\r\n关键字'as'附近的语法不正确。\r\n不正确
关键字“like”附近的语法。\r\n附近的语法不正确
'ansi_nulls.'}
我的剧本
/******对象:视图[dbo].[tidereportemails]脚本日期:
2015年2月23日12:43:36*****/开始设置ansi_nulls
设置带引号的标识符
创建视图[dbo].[tidereportemails]作为select emailid,
emailcontent、emailsubject、emailto、emailfrom、userid、objectvalueid,
emailsent、emailcreated、emailread、emailfromname、emailtype,
电子邮件失败,
当emailread为空时,则“not read”else“read”结束为来自dereportingclient2db.dbo.emails的emailstatus
作为电子邮件1,其中(用户ID
(选择用户ID
从dereportingclient2db.dbo.users
式中(clientid=195)
去吧
/******对象:视图[dbo].[tideunreademails]脚本日期:
2015年2月23日12:43:36*****/开始设置ansi_nulls
设置带引号的标识符
创建视图[dbo].[tideunreademails]为select count(*)为
Undemails,用户id来自dbo.tidereportemails,其中
(emailread为空)按用户ID分组

最佳答案

正则表达式无法正确拆分行;可以使用以下语句之一拆分脚本。
split(新字符串[]{“go”}。
regex.split(sql,@“\bgo\b”,regexoptions.multiline);
下面是一个代码片段

      string connectionString = fmDbSelect();
        using (SqlConnection connection = new SqlConnection(connectionString))
        {

            using (SqlCommand command = new SqlCommand())
            {
                command.Connection = connection;
                connection.Open();
                var scripts = Regex.Split(sql, @"\bGO\b", RegexOptions.Multiline);
                //var scripts = sql.Split(new string[] { "GO" }, StringSplitOptions.None);
                foreach (var splitScript in scripts)
                {
                    command.CommandText = splitScript;
                    command.ExecuteNonQuery();

                }


            }
        }

08-16 00:40