コード例 #1
0
        public void Test_SemiColon_Inside_Inline_Comment()
        {
            //arrange
            var traceService    = new Mock <ITraceService>();
            var sqlStatementRaw =
                $@"--; inline comment
SELECT 1
SELECT 2;

SELECT 3;
";

            //act
            var sut     = new SqlBatchParser(traceService.Object, new SemiColonSqlBatchLineAnalyzer(), new CommentAnalyzer());
            var results = sut.Parse(sqlStatementRaw);

            //assert
            results.Count.ShouldBe(2);
            results[0].BatchText.ShouldBe(
                $@"--; inline comment
SELECT 1
SELECT 2;");
            results[1].BatchText.ShouldBe(
                $@"SELECT 3;");
        }
コード例 #2
0
        public void Test_Go_Inside_Nested_Multiline_Block_Comment()
        {
            //arrange
            var traceService    = new Mock <ITraceService>();
            var sqlStatementRaw =
                $@"/* multiline comment block
/*
GO
*/
*/
SELECT 1;
SELECT 2;
GO

SELECT 3;
GO
";

            //act
            var sut     = new SqlBatchParser(traceService.Object, new GoSqlBatchLineAnalyzer(), new CommentAnalyzer());
            var results = sut.Parse(sqlStatementRaw);

            //assert
            results.Count.ShouldBe(2);
            results.First().BatchText.ShouldBe(
                $@"/* multiline comment block
/*
GO
*/
*/
SELECT 1;
SELECT 2;");
            results[1].BatchText.ShouldBe(
                $@"SELECT 3;");
        }
コード例 #3
0
        static int Main(string[] args)
        {
            var app = new CommandLineApplication();

            app.HelpOption();

            var scriptFileName = app.Argument <string>("script", "SQL script file name")
                                 .IsRequired();
            var stripComments   = app.Option("--strip", "Strip comments", CommandOptionType.NoValue);
            var singleStatement = app.Option("-s|--single", "Output single statements", CommandOptionType.NoValue);

            app.OnExecute(
                () =>
            {
                // The default range searchers
                var rangeSearchers = new List <IRangeSearcher>
                {
                    new MultiLineComment(),
                    new DoubleDashSingleLineComment(),
                    new PoundSignSingleLineComment(),
                    new SqlString(),
                };

                // The special token searchers
                var specialTokenSearchers = new List <ISpecialTokenSearcher>();

                // Add SQL server specific range searcher
                rangeSearchers.Add(new SqlServerIdentifier());

                // Add SQL server specific token searcher
                specialTokenSearchers.Add(new GoSearcher());

                // We want every single SQL statement
                _outputEverySqlStatement = singleStatement.HasValue();
                if (_outputEverySqlStatement)
                {
                    specialTokenSearchers.Add(new SemicolonSearcher());
                }

                var batchParser           = new SqlBatchParser(rangeSearchers, specialTokenSearchers);
                batchParser.SpecialToken += BatchParserOnSpecialToken;
                batchParser.SqlText      += BatchParserOnSqlText;

                using (var source = new TextReaderSource(new StreamReader(scriptFileName.Value), true))
                {
                    batchParser.Process(source, stripComments.HasValue());
                }

                RunSql();

                return(0);
            });

            return(app.Execute(args));
        }
コード例 #4
0
        public void create_a_list_with_an_item_for_each_batch_and_disabled_foreign_keys()
        {
            const string script = @"
SET IDENTITY_INSERT [dbo].[Table_1] ON
INSERT [dbo].[Table_1] (Id, Name) VALUES (1, 'a')
INSERT [dbo].[Table_1] (Id, Name) VALUES (2, 'b')
INSERT [dbo].[Table_1] (Id, Name) VALUES (3, 'c')
SET IDENTITY_INSERT [dbo].[Table_1] OFF
SET IDENTITY_INSERT [dbo].[Table_2] ON
INSERT [dbo].[Table_2] (Id, Name) VALUES (1, 'a')
INSERT [dbo].[Table_2] (Id, Name) VALUES (2, 'b')
INSERT [dbo].[Table_2] (Id, Name) VALUES (3, 'c')
SET IDENTITY_INSERT [dbo].[Table_2] OFF
";

            using (var reader = CreateStreamReader(script))
            {
                var statements = SqlBatchParser.ParseScriptData(reader, batchSize: 2).ToList();
                statements.Should().BeEquivalentTo(new ParsedStatementSet[]
                {
                    new ParsedStatementSet(
                        new ParsedStatement[] {
                        new ParsedStatement("[dbo].[Table_1]", "ALTER TABLE [dbo].[Table_1] NOCHECK CONSTRAINT ALL;", ParsedStatementKind.NoCheckConstraint),
                        new ParsedStatement("[dbo].[Table_2]", "ALTER TABLE [dbo].[Table_2] NOCHECK CONSTRAINT ALL;", ParsedStatementKind.NoCheckConstraint),
                    }),
                    new ParsedInsertStatementSet(
                        new ParsedStatement[] {
                        new ParsedStatement("[dbo].[Table_1]", "SET IDENTITY_INSERT [dbo].[Table_1] ON;", ParsedStatementKind.IdentityInsertOn),
                        new ParsedStatement("[dbo].[Table_1]", "INSERT [dbo].[Table_1] (Id, Name) VALUES\n(1, 'a'),\n(2, 'b');", ParsedStatementKind.Insert, 2),
                        new ParsedStatement("[dbo].[Table_1]", "INSERT [dbo].[Table_1] (Id, Name) VALUES\n(3, 'c');", ParsedStatementKind.Insert, 1),
                        new ParsedStatement("[dbo].[Table_1]", "SET IDENTITY_INSERT [dbo].[Table_1] OFF;", ParsedStatementKind.IdentityInsertOff)
                    }),
                    new ParsedInsertStatementSet(
                        new ParsedStatement[] {
                        new ParsedStatement("[dbo].[Table_2]", "SET IDENTITY_INSERT [dbo].[Table_2] ON;", ParsedStatementKind.IdentityInsertOn),
                        new ParsedStatement("[dbo].[Table_2]", "INSERT [dbo].[Table_2] (Id, Name) VALUES\n(1, 'a'),\n(2, 'b');", ParsedStatementKind.Insert, 2),
                        new ParsedStatement("[dbo].[Table_2]", "INSERT [dbo].[Table_2] (Id, Name) VALUES\n(3, 'c');", ParsedStatementKind.Insert, 1),
                        new ParsedStatement("[dbo].[Table_2]", "SET IDENTITY_INSERT [dbo].[Table_2] OFF;", ParsedStatementKind.IdentityInsertOff),
                    }),
                    new ParsedStatementSet(
                        new ParsedStatement[] {
                        new ParsedStatement("[dbo].[Table_1]", "ALTER TABLE [dbo].[Table_1] WITH CHECK CHECK CONSTRAINT ALL;", ParsedStatementKind.CheckConstraint),
                        new ParsedStatement("[dbo].[Table_2]", "ALTER TABLE [dbo].[Table_2] WITH CHECK CHECK CONSTRAINT ALL;", ParsedStatementKind.CheckConstraint)
                    })
                });
            }
        }
コード例 #5
0
        private IEnumerable <string> SplitIntoSingleStatements(string sql)
        {
            var sqlStatements = new List <string>();

            // The default range searchers
            var rangeSearchers = new List <IRangeSearcher>
            {
                new MultiLineComment(),
                new DoubleDashSingleLineComment(),
                new PoundSignSingleLineComment(),
                new SqlString(),
                new SqlServerIdentifier(),
            };

            // The special token searchers
            var specialTokenSearchers = new List <ISpecialTokenSearcher>()
            {
                new GoSearcher(),
                new SemicolonSearcher(),
            };

            var parser = new SqlBatchParser(rangeSearchers, specialTokenSearchers);

            parser.SqlText += (sender, args) =>
            {
                var content = args.SqlText.Trim();
                if (!string.IsNullOrEmpty(content))
                {
                    sqlStatements.Add(content + ";");
                }
            };

            using (var source = new TextReaderSource(new StringReader(sql), true))
            {
                parser.Process(source);
            }

            return(sqlStatements);
        }
コード例 #6
0
        public void Test_SemiColon_Inside_Sql_Statement_Literal()
        {
            //arrange
            var traceService    = new Mock <ITraceService>();
            var sqlStatementRaw =
                $@"SELECT 1
SELECT 'This is ; inside valid sql statement';

SELECT 3;
";
            //act
            var sut     = new SqlBatchParser(traceService.Object, new SemiColonSqlBatchLineAnalyzer(), new CommentAnalyzer());
            var results = sut.Parse(sqlStatementRaw);

            //assert
            results.Count.ShouldBe(2);
            results[0].BatchText.ShouldBe(
                $@"SELECT 1
SELECT 'This is ; inside valid sql statement';");
            results[1].BatchText.ShouldBe(
                $@"SELECT 3;");
        }
コード例 #7
0
        public void Test_Go_Without_Go_In_Last_Line()
        {
            //arrange
            var traceService    = new Mock <ITraceService>();
            var sqlStatementRaw =
                $@"SELECT 1;
SELECT 2;
GO

SELECT 3;
";
            //act
            var sut     = new SqlBatchParser(traceService.Object, new GoSqlBatchLineAnalyzer(), new CommentAnalyzer());
            var results = sut.Parse(sqlStatementRaw);

            //assert
            results.Count.ShouldBe(2);
            results[0].BatchText.ShouldBe(
                $@"SELECT 1;
SELECT 2;");
            results[1].BatchText.ShouldBe(
                $@"SELECT 3;");
        }
コード例 #8
0
        public List <string> BreakStatements(string sqlStatementRaw)
        {
            var sqlBatchParser = new SqlBatchParser(_traceService, new GoSqlBatchLineAnalyzer(), new CommentAnalyzer());

            return(sqlBatchParser.Parse(sqlStatementRaw).Select(s => s.BatchText).ToList());
        }