正则表达式 - 订购多行SQL字符串

时间:2012-07-21 15:46:10

标签: c# regex

给出一个字符串,例如:

CREATE TABLE [dbo].[Table1] (
    [Id] [int] NOT NULL,
    [Title] [nvarchar](255) NULL
)

ALTER TABLE [dbo].[Table1] ADD
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([Id])

INSERT INTO [dbo].[Table1] ([Id], [Title]) VALUES ('Home', NULL)

CREATE TABLE [dbo].[Table2] (
    [Id] [int] NOT NULL,
    [Title] [nvarchar](255) NULL
)

...

如何对语句进行排序,以使CREATE TABLE位在顶部。我猜我必须使用正则表达式,但我不知道我从哪里去。

我很感激帮助。感谢

2 个答案:

答案 0 :(得分:2)

创建StringBuilder

使用REGEX

  • 提取TABLE个查询并附加到StringBuilder
  • 提取INSERT个查询并附加到StringBuilder
  • 提取ALTER个查询并附加到StringBuilder

例如,您可以使用此正则表达式提取Create个查询:

Regex r = new Regex(@"CREATE .*?(?=(ALTER|INSERT|\z))", RegexOptions.Singleline|RegexOptions.IgnoreCase);
r.Match("CREATE TABLE [dbo]............");

同样,您只需替换上述正则表达式中的ALTERINSERTALTER字词即可提取INSERTCREATE个查询。

答案 1 :(得分:2)

玩LINQ。

var sql = @"CREATE TABLE [dbo].[Table1] (
            [Id] [int] NOT NULL,
            [Title] [nvarchar](255) NULL
        )

        ALTER TABLE [dbo].[Table1] ADD
            CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([Id])

        INSERT INTO [dbo].[Table1] ([Id], [Title]) VALUES ('Home', NULL)

        CREATE TABLE [dbo].[Table2] (
            [Id] [int] NOT NULL,
            [Title] [nvarchar](255) NULL
        )
        ";
var statementOrder = new[] { "CREATE", "ALTER", "INSERT" };
var statements = from statement in Regex.Split(sql, "\n\r")
              let trimStatement = statement.Trim()
              let statementType = trimStatement.Substring(0, trimStatement.IndexOf(' '))
              orderby Array.IndexOf(statementOrder, statementType)
              select trimStatement;
var newSql = String.Join("\n\r", statements.ToArray());