2

与えられた文字列例:

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ビットが一番上になるようにステートメントを並べ替えるにはどうすればよいですか?正規表現を使わないといけないと思いますが、そこからどこへ行くのかわかりません。

助けていただければ幸いです。ありがとう

4

2 に答える 2

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]............");

同様に、上記の正規表現の、、単語を置き換えるだけALTERで、クエリを抽出できます。INSERTALTERINSERTCREATE

于 2012-07-21T16:18:53.243 に答える
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());
于 2012-07-21T22:08:26.673 に答える