Общий хакерский способ сделать это в любой технологии, которая выполняет полный синтаксический анализ / компиляцию перед выполнением, состоит в том, чтобы добавить к коду, о котором идет речь, что-то, что приводит к остановке выполнения. Например, чтобы проверить, проходит ли vbscript проверку синтаксиса без его фактического запуска, я добавляю:
Wscript.exit(1)
Таким образом, я вижу синтаксическую ошибку, если она есть, или если ее нет, то первое действие - выйти из сценария и игнорировать остальную часть кода.
Я думаю, что аналогом в мире sql является повышение ошибки высокой степени серьезности. Если вы используете уровень серьезности 20+, это разрушает соединение, поэтому, если в сценарии несколько пакетов, они все пропускаются. Я не могу подтвердить, что 100,00000% не может быть, каким-то образом SQL-инъекция могла бы справиться с этой предопределенной ошибкой, но я не вижу никакого способа, которым это могло бы произойти. Например, воткнуть это в начале соответствующего блока кода:
raiserror ('syntax checking, disregard error', 20, 1) with log
Итак, это ошибки из синтаксической ошибки:
raiserror ('syntax checking, disregard error', 20, 1) with log
create table t1()
go
create table t2()
go
Пока эта ошибка выходит из ошибки времени выполнения (а t1 / t2 не создаются)
raiserror ('syntax checking, disregard error', 20, 1) with log
create table t1(i int)
go
create table t2( i int)
go
И чтобы округлить ваши параметры, вы можете сослаться на сборку C: \ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.SqlParser.dll в утилите clr (вне из БД) и делать, как:
SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1");