예제 #1
0
        public void FindParameters_NoParameter()
        {
            SqlParser sqlParser = new SqlParser();
            var       paramters = sqlParser.FindParameters("SELECT * FROM Users");

            Assert.AreEqual(0, paramters.Count);
        }
예제 #2
0
        public void FindParameters_WithOneParameter()
        {
            SqlParser sqlParser  = new SqlParser();
            var       parameters = sqlParser.FindParameters("SELECT * FROM Users WHERE Id = @Id");

            Assert.AreEqual(1, parameters.Count);
            Assert.AreEqual("Id", parameters[0]);
        }
예제 #3
0
        public void FindParameters_WithTwoParameters()
        {
            SqlParser sqlParser  = new SqlParser();
            var       parameters = sqlParser.FindParameters("SELECT * FROM Users WHERE Id = @Id AND Name = @Name");

            Assert.AreEqual(2, parameters.Count);
            Assert.AreEqual("Id", parameters[0]);
            Assert.AreEqual("Name", parameters[1]);
        }
예제 #4
0
        public void FindSqlVariables_DeclarationWithKeyWord()
        {
            var sql =
                @"DECLARE  @month_difference VARCHAR(50) = '2566927'
                 SELECT * FROM table WHERE a = @month_difference";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(0, parameters.Count);
        }
예제 #5
0
        public void FindSqlVariables_ExecuteStoreProcedure()
        {
            var sql = @"EXEC sp_api_user_GetServicesSchedule @id = @uid, @adminID = @aid";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(2, parameters.Count);
            Assert.IsTrue(parameters.Contains("uid"));
            Assert.IsTrue(parameters.Contains("aid"));
        }
예제 #6
0
        public void FindSqlVariables_MultipleDeclaration()
        {
            var sql =
                @"DECLARE  @Planner1 VARCHAR(50) = '2566927',
                 @Planner2 varchar(10) = '12201704',
                 @OtherVar int = 42
                 SELECT * FROM table";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(0, parameters.Count);
        }
예제 #7
0
        public void FindSqlVariables_Identity()
        {
            var sql =
                @"SELECT id, @@IDENTITY 
                FROM dbo.table
                WHERE name = @name;";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(1, parameters.Count);
            Assert.AreEqual("name", parameters.First());
        }
예제 #8
0
        public void FindSqlVariables_SingleLineComment()
        {
            var sql =
                @"SELECT * FROM table 
                WHERE -- a = @month_difference AND 
                @z = 1";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(1, parameters.Count);
            Assert.IsTrue(parameters.Contains("z"));
        }
예제 #9
0
        public void FindSqlVariables_MultiLineComment()
        {
            var sql =
                @"SELECT * FROM table 
                WHERE /*a = @month_difference AND 
                @z = 1  AND */ @b = 4
                -- @c = 2";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(1, parameters.Count);
            Assert.IsTrue(parameters.Contains("b"));
        }
예제 #10
0
        public void FindParameters_WithTwoParametersWhenInsert()
        {
            SqlParser sqlParser  = new SqlParser();
            var       parameters = sqlParser.FindParameters(@"INSERT INTO [dbo].[DimCustomer]
                      ([GeographyKey]
                       ,[CustomerAlternateKey])
                 VALUES (
                       @GeographyKey
                       ,@CustomerAlternateKey)
            ");

            Assert.AreEqual(2, parameters.Count);
            Assert.AreEqual("GeographyKey", parameters[0]);
            Assert.AreEqual("CustomerAlternateKey", parameters[1]);
        }
예제 #11
0
        public void FindSqlVariables_IfStatement()
        {
            var sql =
                @"declare @result tinyint = 0;

                    IF @ip = 'unknown'
                        SET @result = 0;
                    ELSE
                        SET @result = 1;

                    select @result;";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(1, parameters.Count);
            Assert.AreEqual("ip", parameters.First());
        }
        public static void TryReportDiagnostics(
            string sqlText,
            ICollection <string> sharpParameters,
            Location location,
            SyntaxNodeAnalysisContext context,
            Orm orm)
        {
            if (string.IsNullOrEmpty(sqlText))
            {
                return;
            }

            if (sharpParameters == null)
            {
                return;
            }

            const char SqlVariableDeclarationSymbol = '@';
            var        sqlVariables = SqlParser.FindParameters(sqlText).ToList();

            if (orm == Orm.Dapper)
            {
                sqlVariables.AddRange(SqlParser.FindDapperLiterals(sqlText));
            }

            sharpParameters = sharpParameters.Select(p => p.Trim(SqlVariableDeclarationSymbol)).ToList();

            foreach (var notFoundArgument in sqlVariables.Except(
                         sharpParameters,
                         StringComparer.InvariantCultureIgnoreCase))
            {
                context.ReportDiagnostic(Diagnostic.Create(CsharpArgumentNotFoundRule, location, notFoundArgument));
            }

            foreach (var notFoundVariable in sharpParameters.Except(
                         sqlVariables,
                         StringComparer.InvariantCultureIgnoreCase))
            {
                context.ReportDiagnostic(Diagnostic.Create(SqlParameterNotFoundRule, location, notFoundVariable));
            }
        }
예제 #13
0
        public void FindSqlVariables_DeclareVariable()
        {
            var sql =
                @"DECLARE @ids udt_ids_list;

                INSERT INTO @ids
                SELECT id 
                FROM dbo.table
                WHERE name = @name;

                DECLARE @idsa udt_ids_list;

                INSERT INTO @idsa
                SELECT id 
                FROM dbo.table
                WHERE name = @name;";

            var parameters = SqlParser.FindParameters(sql);

            Assert.AreEqual(1, parameters.Count);
            Assert.AreEqual("name", parameters.First());
        }