[SQL] 유효성 검사 SQL 스크립트 코드
SQL유효성 검사 SQL 스크립트 코드
어떻게 .NET 2.0 및 C #을 사용하여 실행하기 전에 SQL 스크립트를 확인할 수 있습니까?
는 SQL이 유효하지 않은 경우 나 오류 행을 반환하고자합니다.
해결법
-
==============================
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.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.나는 문제는 .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.'유효'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 문서
from https://stackoverflow.com/questions/3276035/code-to-validate-sql-scripts by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 이름 데이터베이스 디자인 당신이 선호하는 표기법 그 이유는 무엇입니까? (0) | 2020.05.02 |
---|---|
[SQL] SQL 서버 업데이트 트리거 만 수정하기 필드 (0) | 2020.05.02 |
[SQL] 어떻게 MySQL의에 고유 ID를 생성하는? (0) | 2020.05.01 |
[SQL] 집계 함수와 SQL GROUP BY CASE 문 (0) | 2020.05.01 |
[SQL] 하나 개의 출력을위한 두 개의 테이블을 결합 (0) | 2020.05.01 |