给出一个字符串,例如:
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位在顶部。我猜我必须使用正则表达式,但我不知道我从哪里去。
我很感激帮助。感谢
答案 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]............");
同样,您只需替换上述正则表达式中的ALTER
,INSERT
,ALTER
字词即可提取INSERT
,CREATE
个查询。
答案 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());