示例#1
0
        private void Parse(TSql80Parser parser, string inputScript)
        {
            IList <ParseError> errors;

            using (StringReader sr = new StringReader(inputScript))
            {
                fragment = parser.Parse(sr, out errors);
            }

            if (errors != null && errors.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (var error in errors)
                {
                    sb.AppendLine(error.Message);
                    sb.AppendLine("offset " + error.Offset.ToString());
                }
                throw new ArgumentException("InvalidSQLScript", sb.ToString());
            }
        }
示例#2
0
        static void Main(string[] args)
        {
            if (args.Count() < 1)
            {
                Console.WriteLine("No input file specified");
                return;
            }

            FileInfo input = new FileInfo(args[0]);

            SqlScriptGeneratorOptions scriptOptions = new SqlScriptGeneratorOptions()
            {
                AlignClauseBodies           = true,
                AlignColumnDefinitionFields = true,
                AlignSetClauseItem          = true,
                AsKeywordOnOwnLine          = true,
                IncludeSemicolons           = true,
                IndentationSize             = 4,
                IndentSetClause             = true,
                IndentViewBody               = true,
                KeywordCasing                = KeywordCasing.Lowercase,
                MultilineInsertSourcesList   = true,
                MultilineInsertTargetsList   = true,
                MultilineSelectElementsList  = true,
                MultilineSetClauseItems      = true,
                MultilineViewColumnsList     = true,
                MultilineWherePredicatesList = true,
                NewLineBeforeCloseParenthesisInMultilineList = true,
                NewLineBeforeFromClause    = true,
                NewLineBeforeGroupByClause = true,
                NewLineBeforeHavingClause  = true,
                NewLineBeforeJoinClause    = true,
                NewLineBeforeOffsetClause  = true,
                NewLineBeforeOpenParenthesisInMultilineList = true,
                NewLineBeforeOrderByClause = true,
                NewLineBeforeOutputClause  = true,
                NewLineBeforeWhereClause   = true,
                SqlVersion = SqlVersion.Sql110
            };

            bool                 initialQuotedIdentifiers = false;
            TSqlParser           parser    = new TSql80Parser(initialQuotedIdentifiers);
            Sql80ScriptGenerator scriptGen = new Sql80ScriptGenerator(scriptOptions);

            StreamReader       sr = input.OpenText();
            IList <ParseError> errors;

            TSqlFragment fragment = parser.Parse(sr, out errors);

            sr.Close();

            if (errors.Count > 0)
            {
                Console.WriteLine("Parse {0} errors input stream", errors.Count);
                return;
            }

            RaiserrorVisitor visitor = new RaiserrorVisitor();

            fragment.Accept(visitor);

            var newTokenStream = new List <TSqlParserToken>();

            for (int n = 0; n < visitor.Nodes.Count; n++)
            {
                var node = visitor.Nodes[n];

                var beginTokenIndex = (n == 0 ? 0 : node.FirstTokenIndex);
                var firstTokenIndex = node.FirstTokenIndex;
                var lastTokenIndex  = node.LastTokenIndex;
                var nextTokenIndex  = (n < (visitor.Nodes.Count - 1) ? visitor.Nodes[n + 1].FirstTokenIndex : node.ScriptTokenStream.Count);

                var msg = node.SecondParameter as StringLiteral;

                int    severity = 10;
                int    state    = 0;
                string errmsg   = msg.Value;

                RaiseErrorStatement newErr = new RaiseErrorStatement()
                {
                    FirstParameter  = CreateStringLiteral(errmsg),
                    SecondParameter = CreateIntegerLiteral(severity),
                    ThirdParameter  = CreateIntegerLiteral(state)
                };

                var errTokens = scriptGen.GenerateTokens(newErr);

                // copy token till element where replaced statement begins
                for (int i = beginTokenIndex; i < firstTokenIndex; i++)
                {
                    Console.WriteLine("Token: [{0}] Text: [{1}]", node.ScriptTokenStream[i].TokenType.ToString(), node.ScriptTokenStream[i].Text);
                    newTokenStream.Add(node.ScriptTokenStream[i]);
                }

                // inject new statement
                for (int i = 0; i < errTokens.Count; i++)
                {
                    Console.WriteLine("Token: [{0}] Text: [{1}]", errTokens[i].TokenType.ToString(), errTokens[i].Text);
                    newTokenStream.Add(errTokens[i]);
                }

                // copy tokens between last and next, if last token, till end of stream
                for (int i = lastTokenIndex + 1; i < nextTokenIndex; i++)
                {
                    Console.WriteLine("Token: [{0}] Text: [{1}]", node.ScriptTokenStream[i].TokenType.ToString(), node.ScriptTokenStream[i].Text);
                    newTokenStream.Add(node.ScriptTokenStream[i]);
                }
            }

            TSqlFragment newFragment = parser.Parse(newTokenStream, out errors);

            if (errors.Count > 0)
            {
                Console.WriteLine("Parse {0} errors output stream", errors.Count);
                return;
            }

            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            scriptGen.GenerateScript(newFragment, sw);

            Console.WriteLine("-------------------------------------------------------");
            for (int i = 0; i < newTokenStream.Count; i++)
            {
                Console.Write(newTokenStream[i].Text);
            }
            Console.WriteLine("-------------------------------------------------------");
        }
示例#3
0
        private void Parse(TSql80Parser parser, string inputScript)
        {
            IList<ParseError> errors;

            using (StringReader sr = new StringReader(inputScript))
            {
                fragment = parser.Parse(sr, out errors);
            }

            if (errors != null && errors.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (var error in errors)
                {
                    sb.AppendLine(error.Message);
                    sb.AppendLine("offset " + error.Offset.ToString());
                }
                throw new ArgumentException("InvalidSQLScript", sb.ToString());
            }
        }
示例#4
0
 private void SQLParser80(bool quotedIdentifier, string inputScript)
 {
     TSql80Parser parser80 = new TSql80Parser(quotedIdentifier);
     Parse(parser80, inputScript);
 }
示例#5
0
        static void Main(string[] args)
        {
            if (args.Count() < 1)
            {
                Console.WriteLine("No input file specified");
                return;
            }

            FileInfo input = new FileInfo(args[0]);

            SqlScriptGeneratorOptions scriptOptions = new SqlScriptGeneratorOptions()
            {
                AlignClauseBodies = true,
                AlignColumnDefinitionFields = true,
                AlignSetClauseItem = true,
                AsKeywordOnOwnLine = true,
                IncludeSemicolons = true,
                IndentationSize = 4,
                IndentSetClause = true,
                IndentViewBody = true,
                KeywordCasing = KeywordCasing.Lowercase,
                MultilineInsertSourcesList = true,
                MultilineInsertTargetsList = true,
                MultilineSelectElementsList = true,
                MultilineSetClauseItems = true,
                MultilineViewColumnsList = true,
                MultilineWherePredicatesList = true,
                NewLineBeforeCloseParenthesisInMultilineList = true,
                NewLineBeforeFromClause = true,
                NewLineBeforeGroupByClause = true,
                NewLineBeforeHavingClause = true,
                NewLineBeforeJoinClause = true,
                NewLineBeforeOffsetClause = true,
                NewLineBeforeOpenParenthesisInMultilineList = true,
                NewLineBeforeOrderByClause = true,
                NewLineBeforeOutputClause = true,
                NewLineBeforeWhereClause = true,
                SqlVersion = SqlVersion.Sql110
            };

            bool initialQuotedIdentifiers = false;
            TSqlParser parser = new TSql80Parser(initialQuotedIdentifiers);
            Sql80ScriptGenerator scriptGen = new Sql80ScriptGenerator(scriptOptions);

            StreamReader sr = input.OpenText();
            IList<ParseError> errors;

            TSqlFragment fragment = parser.Parse(sr, out errors);
            sr.Close();

            if (errors.Count > 0)
            {
                Console.WriteLine("Parse {0} errors input stream", errors.Count);
                return;
            }

            RaiserrorVisitor visitor = new RaiserrorVisitor();
            fragment.Accept(visitor);

            var newTokenStream = new List<TSqlParserToken>();

            for (int n = 0; n < visitor.Nodes.Count; n++)
            {
                var node = visitor.Nodes[n];

                var beginTokenIndex = (n == 0 ? 0 : node.FirstTokenIndex);
                var firstTokenIndex = node.FirstTokenIndex;
                var lastTokenIndex = node.LastTokenIndex;
                var nextTokenIndex = (n < (visitor.Nodes.Count - 1) ? visitor.Nodes[n + 1].FirstTokenIndex : node.ScriptTokenStream.Count);

                var msg = node.SecondParameter as StringLiteral;

                int severity = 10;
                int state = 0;
                string errmsg = msg.Value;

                RaiseErrorStatement newErr = new RaiseErrorStatement()
                {
                    FirstParameter = CreateStringLiteral(errmsg),
                    SecondParameter = CreateIntegerLiteral(severity),
                    ThirdParameter = CreateIntegerLiteral(state)
                };

                var errTokens = scriptGen.GenerateTokens(newErr);

                // copy token till element where replaced statement begins
                for (int i = beginTokenIndex; i < firstTokenIndex; i++)
                {
                    Console.WriteLine("Token: [{0}] Text: [{1}]", node.ScriptTokenStream[i].TokenType.ToString(), node.ScriptTokenStream[i].Text);
                    newTokenStream.Add(node.ScriptTokenStream[i]);
                }

                // inject new statement
                for (int i = 0; i < errTokens.Count; i++)
                {
                    Console.WriteLine("Token: [{0}] Text: [{1}]", errTokens[i].TokenType.ToString(), errTokens[i].Text);
                    newTokenStream.Add(errTokens[i]);
                }

                // copy tokens between last and next, if last token, till end of stream
                for (int i = lastTokenIndex + 1; i < nextTokenIndex; i++)
                {
                    Console.WriteLine("Token: [{0}] Text: [{1}]", node.ScriptTokenStream[i].TokenType.ToString(), node.ScriptTokenStream[i].Text);
                    newTokenStream.Add(node.ScriptTokenStream[i]);
                }
            }

            TSqlFragment newFragment = parser.Parse(newTokenStream, out errors);
            if (errors.Count > 0)
            {
                Console.WriteLine("Parse {0} errors output stream", errors.Count);
                return;
            }

            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
            scriptGen.GenerateScript(newFragment, sw);

            Console.WriteLine("-------------------------------------------------------");
            for (int i = 0; i < newTokenStream.Count; i++)
            {
                Console.Write(newTokenStream[i].Text);
            }
            Console.WriteLine("-------------------------------------------------------");
        }
示例#6
0
        private void SQLParser80(bool quotedIdentifier, string inputScript)
        {
            TSql80Parser parser80 = new TSql80Parser(quotedIdentifier);

            Parse(parser80, inputScript);
        }
示例#7
0
        /// <summary>
        /// A simple T-SQL comment cleaner based on the SQLDOM that ships with SQL Management Studio / DACFX.
        /// After parsing the input file, we just loop through the input token stream, ignore any comment related token
        /// and write out the other tokens to the output file.
        /// </summary>
        /// <param name="sourceFile"></param>
        /// <param name="destFile"></param>
        /// <param name="compatLevel"></param>
        /// <returns></returns>
        static bool CleanSQLScript(
            string sourceFile,
            string destFile,
            int compatLevel)
        {
            using (var srcRdr = new StreamReader(sourceFile))
            {
                TSqlParser parser;

                switch (compatLevel)
                {
                case 80:
                {
                    // SQL 2000
                    parser = new TSql80Parser(true);
                    break;
                }

                case 90:
                {
                    // SQL 2005
                    parser = new TSql90Parser(true);
                    break;
                }

                case 100:
                {
                    // SQL 2008 / R2
                    parser = new TSql100Parser(true);
                    break;
                }

                case 110:
                {
                    // SQL 2012
                    parser = new TSql110Parser(true);
                    break;
                }

                case 120:
                {
                    // SQL 2014
                    parser = new TSql120Parser(true);
                    break;
                }

                case 130:
                {
                    // SQL 2016
                    parser = new TSql130Parser(true);
                    break;
                }

                case 140:
                {
                    // SQL 2017
                    parser = new TSql140Parser(true);
                    break;
                }

                default:
                {
                    parser = new TSql110Parser(true);
                    break;
                }
                }

                IList <ParseError> errors;
                var tree = parser.Parse(srcRdr, out errors);

                if (errors.Count > 0)
                {
                    // TODO report parse errors
                    Console.WriteLine("Errors when parsing T-SQL");
                    return(false);
                }

                using (var writer = new StreamWriter(destFile))
                {
                    foreach (var tok in tree.ScriptTokenStream)
                    {
                        // ignore all comments
                        if (tok.TokenType != TSqlTokenType.MultilineComment &&
                            tok.TokenType != TSqlTokenType.SingleLineComment)
                        {
                            writer.Write(tok.Text);
                        }
                    }

                    writer.Flush();
                    writer.Close();
                }
            }

            return(true);
        }