programing

TSQL 문의 유효성을 프로그래밍 방식으로 확인(파싱)하려면 어떻게 해야 합니까?

cafebook 2023. 9. 20. 20:44
반응형

TSQL 문의 유효성을 프로그래밍 방식으로 확인(파싱)하려면 어떻게 해야 합니까?

저는 통합 검사를 더 무력하게 만들려고 노력하고 있습니다.한 가지 아이디어는 모든 테스트 후 롤백을 실행하는 것이었고, 다른 아이디어는 Query Analyzer 또는 SSMS의 녹색 확인란과 유사하게 텍스트를 프로그램적으로 구문 분석하는 것이었습니다.

명령을 ADO를 사용하여 실행하지 않고 SQL Server가 명령을 구문 분석하도록 하려면 어떻게 해야 합니까?NET?

업데이트: 최종적으로 원하는 대로 작동한 것입니다.

using (DbCommand executeOnly = Factory.DbCommand())
{
    executeOnly.Connection = command.Connection;
    executeOnly.CommandType = CommandType.Text;
    executeOnly.CommandText = "SET NOEXEC ON;" + sqlCommand;
    executeOnly.Connection.Open();
    executeOnly.ExecuteNonQuery();
}
//set more properties of command.
command.Execute();

설명할 수 없는 이유로,"SET PARSEONLY ON" 쿼리 분석기에서만 작동했습니다.ADO에 설정을 못 했어요.NET 연결.그것은 당연한 이유는PARSEONLY일반적인 오류가 아닌 구문 오류만 잡는 것 같습니다.SET NOEXEC ON에서는 누락된 테이블 또는 열을 참조하는 보기 또는 저장 프로시저의 누락된 매개 변수와 같은 보다 다양한 오류를 탐지합니다.

당신이 찾고 있는 명령어는.연결에 대해 설정하면 쿼리가 구문 분석되지만 실행되지 않습니다.또 다른 선택지는SET PARSEONLY ON, 솔직히 둘의 차이가 뭔지는 잘 모르겠어요.

에릭의 대답에 +1.하지만 전 발견했어요SET FMTONLY ON로도 유용한SET NOEXEC ON모든 오류를 토해내는 것 같지는 않습니다.

예.

SELECT * FROM ATableThatDoesNotExist

함께 실행하기SET NOEXEC ON데이터베이스에 테이블이 존재하지 않음에도 불구하고 성공적이었다고 말합니다.실행 중SET FMTONLY ON대신, "Invalid object name" 오류를 던집니다.

SET FMTONLY ON은 또한 반환될 결과 세트에 대한 메타데이터를 반환하며, 이는 매우 유용하게 사용될 수 있습니다.

SQL Server 2012는 다음과 같은 시스템 프로시저 및 기능으로 구문, 프로시저 및 테이블을 구문 분석할 수 있습니다.

그들은 "SET FMTONLY"를 대체할 것으로 추정됩니다.

테스트해 보았는데 "SET NO EXECON" 및 "SET PARS ONLY ON"보다 훨씬 더 잘 작동합니다.

예:

오류를 던지지 않음:

sp_describe_undeclared_parameters
    @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;'

오류를 올바르게 던집니다("SET NOEXEC" 및 "SET PARS ONLY"는 이 경우 오류를 던지지 않습니다).

sp_describe_undeclared_parameters 
  @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;SELECT object_id, name, type_desc FROM sys.NOTaTABLE;'

다음 쿼리 사용

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF

SET PARSONLY : 각 Transact-SQL 문의 구문을 검사하고 문을 컴파일하거나 실행하지 않고 오류 메시지를 반환합니다.

정말로 시험의 목적에 따라 다릅니다.

가장 신뢰할 수 있는 방법은 모든 테스트가 끝난 후에 롤백을 사용하는 것입니다. 만약 여러분의 진술이 그것에 도움이 된다면 말이죠(실행 가능하게 만들기에는 너무 무거운 무게가 아닙니다).

저는 과거에 이 작업을 해본 적이 있으며, 다른 방법으로는 발견하지 못했을 런타임 문제에 대해 통지를 받게 되어 기뻤습니다.

VSTSDBPro에는 프로그래밍 방식으로 액세스할 수 있는 쿼리 파서가 있습니다. 링크

언급URL : https://stackoverflow.com/questions/3084387/how-can-i-programmatically-check-parse-the-validity-of-a-tsql-statement

반응형