对于编译指示指令,SQLScript 提供了一种提供元信息的新方法。编译指示指令可用于注释 SQLScript 代码,但它们本身没有函数,只影响其他语句和声明。编译指示指令是明显不同的语法元素,类似于注释,但虽然注释为代码读取器提供信息,但编译指示指令向编译器和代码分析器提供信息。
代码语法程序头
虽然确切的语义取决于特定的编译指示指令类型,但通常有一些规则适用于编译指示指令。标识符不区分大小写,这意味着编译指示指令和编译指示指令被识别为相同的编译指示指令。但是,编译指示指令参数区分大小写。
编译指示指令范围影响一个 pushscope 和下一个 popscope 之间的所有声明或语句,以及推式范围中指定的所有编译指示指令。 示例代码do begin @pushscope(@AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY')) declare a int; declare b nvarchar(500); @popscope() declare c date; select :c from dummy;end 在上面的示例中, a 和 b 的声明将受编译指示指令 'AnalyzerSuppress' 影响,而 c 和 SELECT 语句的声明不受影响。 编译指示指令范围与代码的逻辑结构无关。这意味着,无论执行哪些代码部分,编译指示指令范围始终会影响相同的语句和声明。 示例代码create procedure proc(in a int, in b int) asbegin @pushscope(@AnalyzerSuppress('SAP.USE_OF_UNASSIGNED_SCALAR_VARIABLE.CONSISTENCY')) if a < b then declare c date; select :c from dummy; @popscope() end if; a = :b; -- line 9end 在此示例中,第 9 行上的分配永远不会受到编译指示指令的影响。另一方面,SELECT 语句将始终受编译指示指令的影响。
在声明或语句之前使用推送范围和单个编译指示指令时,所有推送范围都必须位于第一个单个编译指示指令之前。不允许任意混合推式范围和单个编译指示指令。有关详细信息,请参阅限制部分中的示例。
单个编译指示指令会影响下一个语句或声明。这包括语句或声明中包含的所有内容。 示例代码do begin @AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') declare a, b, c int; @AnalyzerSuppress('SAP.USE_OF_UNASSIGNED_SCALAR_VARIABLE.CONSISTENCY') a = :b + 1;end 在此示例中,第 2 行上的单个编译指示指令将影响三个变量 a 、 b 和 c 的声明。第 4 行上的单个编译指示指令将影响分配及其所有部分。这还包括右侧的表达式 :b + 1 。 包含块(即基本块、循环和条件)的语句存在例外。附加到基本块、循环或条件的编译指示指令不会影响这些块中的声明和语句。 示例代码do begin @AnalyzerSupress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') begin declare a nvarchar(50); select * from dummy; end;end
在此示例中,编译指示指令既不会影响 的声明,也不会影响 SELECT 语句。由于此类块属于常规 SQLScript 代码,您可以直接添加编译指示指令或编译指示指令范围。
AnalyzerSuppress('NAME_SPACE.RULE_NAME.CATEGORY', ...)
单个编译指示指令不能紧跟编译指示指令范围。 示例代码do begin /* NOT allowed*/ @AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') @pushScope(@AnalyzerSuppress('SAP.UNUSED_VARIABLE_VALUE.CONSISTENCY')) declare a, b int = 5; @popscope()end do begin /* NOT allowed*/ @AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') @pushScope(@AnalyzerSuppress('SAP.UNUSED_VARIABLE_VALUE.CONSISTENCY')) @someOtherPragma() declare a, b int = 5; @popscope()end do begin /*allowed*/ @pushScope(@AnalyzerSuppress('SAP.UNUSED_VARIABLE_VALUE.CONSISTENCY')) @AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') declare a, b int = 5; @popscope()end do begin /*allowed*/ @pushScope(@AnalyzerSuppress('SAP.UNUSED_VARIABLE_VALUE.CONSISTENCY')) declare a int; @AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') declare b int = 5; @popscope()end do begin /*allowed*/ @pushScope(@AnalyzerSuppress('SAP.UNUSED_VARIABLE_VALUE.CONSISTENCY')) declare a int; @AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY') @someOtherPragma() declare b int = 5; @popscope()end 在过程的初始开始之前,不允许在参数声明列表和声明列表中使用编译指示指令范围。 示例代码-- not allowedcreate procedure wrong_proc(@pushscope(@AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY')) in a int, in b nvarchar @popscope())as begin select * from dummy;end -- not allowedcreate procedure wrong_proc as @pushscope(@AnalyzerSuppress('SAP.UNNECESSARY_VARIABLE.CONSISTENCY')) a int; b nvarchar; @popscope()begin select * from dummy;end