복붙노트

[SQL] 유효성 검사 SQL 스크립트 코드

SQL

유효성 검사 SQL 스크립트 코드

어떻게 .NET 2.0 및 C #을 사용하여 실행하기 전에 SQL 스크립트를 확인할 수 있습니까?

는 SQL이 유효하지 않은 경우 나 오류 행을 반환하고자합니다.

해결법

  1. ==============================

    1.당신은 사용자가 손으로 몇 가지 SQL 코드를 입력 할 수있는 도구를 작성하고 SQL 서버에서 실행 전에 C # 코드를 사용하여 입력 된 코드를 확인하려면이 같은 방법을 만들 수 있습니다 :

    당신은 사용자가 손으로 몇 가지 SQL 코드를 입력 할 수있는 도구를 작성하고 SQL 서버에서 실행 전에 C # 코드를 사용하여 입력 된 코드를 확인하려면이 같은 방법을 만들 수 있습니다 :

    using Microsoft.Data.Schema.ScriptDom;
    using Microsoft.Data.Schema.ScriptDom.Sql;
    
    public class SqlParser
    {
            public List<string> Parse(string sql)
            {
                TSql100Parser parser = new TSql100Parser(false);
                IScriptFragment fragment;
                IList<ParseError> errors;
                fragment = parser.Parse(new StringReader(sql), out errors);
                if (errors != null && errors.Count > 0)
                {
                    List<string> errorList = new List<string>();
                    foreach (var error in errors)
                    {
                        errorList.Add(error.Message);
                    }
                    return errorList;
                }
                return null;
            }
    }
    

    2018 년 새 데이터베이스 버전으로,이 최신 버전이있을 수 있습니다 :

    using Microsoft.SqlServer.TransactSql.ScriptDom;
    

    (NPM과 다운로드 : PM> 설치 - 패키지 Microsoft.SqlServer.TransactSql.ScriptDom -Version 14.0.3811.1)

    public bool IsSQLQueryValid(string sql, out List<string> errors)
    {
        errors = new List<string>();
        TSql140Parser parser = new TSql140Parser(false);
        TSqlFragment fragment;
        IList<ParseError> parseErrors;
    
        using (TextReader reader = new StringReader(sql))
        {
            fragment = parser.Parse(reader, out parseErrors);
            if (parseErrors != null && parseErrors.Count > 0)
            {
                errors = parseErrors.Select(e => e.Message).ToList();
                return false;
            }
        }
        return true;
    }
    
  2. ==============================

    2.SSMS는이 일을하는 방법이있다.

    SSMS는이 일을하는 방법이있다.

    당신은 SQL 프로파일 러를 사용하는 경우는 SET PARSEONLY ON, 다음 SQL 다음 SET PARSEONLY OFF를 실행하고 오류가 컴파일 또는 쿼리를 실행하지 않고 증가하는 것을 볼 수 있습니다.

    SET PARSEONLY ON;
    SELECT * FROM Table; --Query To Parse
    SET PARSEONLY OFF; 
    

    PARSEONLY

    그것은 결국 SSMS에서 작동, 전 C #에서이 문제를 해본 적이 있지만 나는 그것이 작동하지 말아야 이유가 없습니다.

    마틴 스미스는 의견에서 지적한 것처럼 당신은 SET NOEXEC ON을 사용할 수 있습니다

    MSDN은 모두 명령에 대한 다음을 말한다.

    그 곳 PARSEONLY은하지 않습니다 NOEXEC는 쿼리를 컴파일을 나타냅니다. NOEXEC 오류를 잡을 수 있도록 PARSEONLY은하지 않습니다. 사용법은 동일합니다.

    SET NOEXEC ON;
    SELECT * FROM Table; --Query To Parse
    SET NOEXEC OFF; 
    

    NOEXEC

  3. ==============================

    3.나는 문제는 .NET 2.0에 대한 것을 알고 있지만, 그것은 사람을 흥미로운 일이 될 수 있습니다. 쿼리의 검증이 약간 마이크로 소프트 SQL 서버의 최신 버전에서 변경되었습니다. 네임 스페이스는 대신 Microsoft.Data.Schema.ScriptDom의 Microsoft.SqlServer.TransactSql.ScriptDom입니다.

    나는 문제는 .NET 2.0에 대한 것을 알고 있지만, 그것은 사람을 흥미로운 일이 될 수 있습니다. 쿼리의 검증이 약간 마이크로 소프트 SQL 서버의 최신 버전에서 변경되었습니다. 네임 스페이스는 대신 Microsoft.Data.Schema.ScriptDom의 Microsoft.SqlServer.TransactSql.ScriptDom입니다.

    어디에서이 라이브러리를 찾는 방법은?

    라이브러리 경로는 %의 PROGRAMFILES (86) % \ Microsoft SQL Server를 \ 120 \ SDK \ 어셈블리 이 라이브러리를 찾을 수없는 및 Microsoft SQL Server가 설치되어있는 경우, 120에서 110 또는 100에 변화를 시도하고 대응하는 파서 (각각 TSql110Parser 또는 TSql100Parser)를 사용합니다.

    사용하는 방법?

    입력 문자열이 유효한 SQL 쿼리이고 두 번째는 구문 분석 오류를 얻기 위해 사용할 수 있는지 여부를 첫 번째 확장 검사 : 나는 두 가지 확장 기능을 가지고있다.

    using Microsoft.SqlServer.TransactSql.ScriptDom;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    
    public static class SqlStringExtensions
    {
        public static bool IsValidSql(this string str)
        {
            return !str.ValidateSql().Any();
        }
    
        public static IEnumerable<string> ValidateSql(this string str)
        {
            if (string.IsNullOrWhiteSpace(str))
            {
                return new[] { "SQL query should be non empty." };
            }
            var parser = new TSql120Parser(false);
            IList<ParseError> errors;
            using (var reader = new StringReader(str))
            {
                parser.Parse(reader, out errors);
            }
            return errors.Select(err => err.Message);
        }
    }
    

    또한, I는 입력 SQL 쿼리가 null가 아닌 것을 확인하거나 비어, 파서가 빈 문자열이 완벽하게 유효하다고 생각하기 때문에 (나는 그것을 판단하지 않는다).

    어떻게 테스트?

    이 확장 기능을 사용하는 방법을 보여 세 NUnit과 테스트가 있습니다.

    using System.Collections.Generic;
    using System.Linq;
    using NUnit.Framework;
    
    [TestFixture]
    public class SqlStringExtensionsTests
    {
        [Test]
        public void ValidateSql_InvalidSql_ReturnsErrorMessages()
        {
            // this example doesn't contain "," between the field names
            string invalidSql = "SELECT /*comment*/ " +
                "CustomerID AS ID CustomerNumber FROM Customers";
            IEnumerable<string> results = invalidSql.ValidateSql();
            Assert.AreNotEqual(0, results.Count());
        }
    
        [Test]
        public void IsValidSql_ValidSql_ReturnsTrue()
        {
            string validSql = "SELECT /*comment*/ " +
                "CustomerID AS ID, CustomerNumber FROM Customers";
            bool result = validSql.IsValidSql();
            Assert.AreEqual(true, result);
        }
    
        [Test]
        public void IsValidSql_InvalidSql_ReturnsFalse()
        {
            // this example doesn't contain "," between the field names
            string invalidSql = "SELECT /*comment*/ "+
                " CustomerID AS ID CustomerNumber FROM Customers";
            bool result = invalidSql.IsValidSql();
            Assert.AreEqual(false, result);
        }
    }
    
  4. ==============================

    4.'유효'SQL의 의미는 무엇입니까? 구문 또는 결과?

    '유효'SQL의 의미는 무엇입니까? 구문 또는 결과?

    구문을 확인하는 유일한 확실한 방법은이 SQL Server의 SQL을 실행합니다. 당신이 마지막에 롤백을 수행 한 후 거래에서 SQL을 실행하는 것으로 간주하고 있나요?

    Begin Transaction
    
    --execute your code between the 'Begin Transaction' and the 'rollback' keywords.
    ...
    
    --example
    Insert into mytable(ID)Values(2)
    
    ...
    
    Rollback
    

    롤백에 대한 MSDN 문서

  5. from https://stackoverflow.com/questions/3276035/code-to-validate-sql-scripts by cc-by-sa and MIT license