用结果设置ParseOnly

时间:2018-03-16 13:34:45

标签: c# sql sql-server

从c#我试图检查,如果SQL使用ID TFD1 Date CCA D-6 789 11-01-2017 AA D-1 123 24-01-2017 BA D-2 123 25-01-2017 AA D-4 456 13-01-2017 BS D-5 456 15-01-2017 AA 有效,正如您在以下示例中看到的那样

SET PARSEONLY ON

在SQL中,这会给出错误

BEGIN TRY
   SET PARSEONLY ON UPDATE SchedulerAction S ET
   SELECT 1
END TRY
BEGIN CATCH
   SELECT -1
END CATCH

但我的问题是,Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'S'. 没有捕获到此错误,并且某些try-catch都没有运行。

如果我将SQL更改为SELECT 它给出了以下错误

SET PARSEONLY ON UPDATE SchedulerAction SET

但它既未提供Msg 156, Level 15, State 1, Line 3 Incorrect syntax near the keyword 'SELECT'.

的结果

如果我将其更改为SELECT之类的有效SQL,则SET PARSEONLY ON UPDATE SchedulerAction SET Action = 1中的SELECT都不会运行。

如果通过返回例如验证是正确的还是错误的,可以以某种方式得到结果。一个try或类似的东西?

2 个答案:

答案 0 :(得分:0)

TRY-CATCH捕获运行时错误。语法错误在解析时捕获。 TRY块中的语法错误不会导致CATCH块执行。

您所看到的是预期的行为。

答案 1 :(得分:0)

可以不将语句作为原始块的一部分,而是动态执行它:

SET PARSEONLY ON

SEND和另一个语句之间的分号并不奢侈,因为如果没有语句终止符(如SELECT * FROM sys.tables ORDER BY $语句等),某些语句将无法正确解析。

单纯的语法有效性可能仍然意味着语句没有语义约束,我并不是指明显的错误表名:ORDER BY无效,因为$子句中不允许使用常量(和是的,SET NOEXEC ON本身就是一个常数),但它仍然会正确解析。使用SET PARSEONLY ON代替CREATE VIEW会捕获这些内容,但代价是不允许某些语句可能只出现在批处理中(如cwiseProduct)。