从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
或类似的东西?
答案 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
)。