是否可以根据 SQL Server 版本选择 RAISERROR 或 THROW?

tho*_*ett 11 sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012 sql-server-2014

这是我现在的代码:

BEGIN TRY
INSERT INTO TABLE (F1,F2,F3) 
VALUES ('1','2','3')
END TRY
BEGIN CATCH
;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

效果很好,除非它在装有 SQL 2008 的机器上运行。我想让 CATCH 块检查 SQL 版本并运行 THROW(如果它等于或高于 2012 年),如果是 2008 年则运行 RAISERROR。我一直遇到语法错误,我想知道是否有可能。即使像这样简单的事情也不适合我。

BEGIN CATCH
IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏。

Mar*_*ith 9

不,这是不可能的。

这是早期版本中的无效语法,会导致编译错误。

这是不可能隐藏THROWEXECcatch块内无论是作为一个参数的抛必须直接包含在里面抓。

您需要根据要部署到的 SQL Server 的版本来部署所需的代码版本(不幸的是,我所知道的 SSDT 工具中对此也没有很好的支持 - 没有等价于通过以下方式有选择地包含代码行条件编译)