我需要知道在执行查询之前如何解析查询以确定它是否构建良好。如果解析是正确的,那么执行它,如果不丢弃它。
我无法使用SET NOEXEC,SET PARSEONLY,TRY / CATCH完成此操作。
我在循环中使用动态sql 。有时动态sql 不正确,不是因为我的错,而是因为数据库中存在的信息。出于这个原因,我想在执行之前解析它。
答案 0 :(得分:7)
对于某些sp_executesql技巧,这可能是可能的:
-- The query you would like to parse
declare @sql nvarchar(max)
set @sql = 'select 1'
declare @testsql nvarchar(max)
declare @result int
set @testsql = N'set parseonly on; ' + @sql
exec @result = sp_executesql @testsql
-- If it worked, execute it
if @result = 0
begin
exec sp_executesql @sql
end
如果我使用不正确的查询,例如'salact 1',则@result值不为零。
TRY / CATCH似乎与sp_executesql不兼容,所以我正在检查返回值。
答案 1 :(得分:3)
答案 2 :(得分:3)
你想要完成什么?
如前所述,除非查询是可解析的,否则T-SQL将无法编译。
如果您只想验证查询是否正常(例如,验证您没有忘记where语句),那么showplan可能会帮助您
set showplan_xml on
这将告诉sql server只解析查询(查询本身永远不会被执行)并返回它的执行计划。它主要用于性能问题,但也可以用作指针,以防查询错误。