允许更新的SQL语法在旧版本上优雅地回退?

时间:2017-03-28 16:39:20

标签: sql sql-server tsql

我支持一个老旧的ASP.net系统,该系统必须在众多客户的旧版SQL Server上运行(回到2005年)。

有没有办法使用更高版本的SQL Server功能而不会遇到Incorrect syntax near....错误?

我想在Azure SQL 12上使用的当前功能是AT DATE TIME,例如select CONVERT(datetime, SYSDATETIMEOFFSET() AT TIME ZONE 'GMT Standard Time')实现自定义GETDATE()函数,但早期的Sql版本拒绝编译它。

是唯一一个在sql字符串上运行exec()的选项,还是有更优雅的解决方案?

--do a version check, and then run the appropriate sql string?
if (CHARINDEX('Azure', @@VERSION,0) > 0)    
    exec('select CONVERT(datetime, SYSDATETIMEOFFSET() AT TIME ZONE ''GMT Standard Time'')')
else
    select getDate()

2 个答案:

答案 0 :(得分:2)

您的选择如下:

  1. 动态Sql,这就是你在做什么。
  2. 让客户端程序/应用程序首先检查版本,然后调整其查询/请求(实际上只是将动态部分推送到客户端)。
  3. 使用专门为其所在的SQL Server版本编写的存储过程。
  4. 其中,#3是首选解决方案。

答案 1 :(得分:0)

这是解决代码问题的想法......

DECLARE @LocalOffset INT = -5
DECLARE @DaylightSavings INT = 0
DECLARE @OffSet INT = @LocalOffset + @DaylightSavings
SELECT DATEADD(HOUR,@OffSet,GETUTCDATE())

显然还有其他方法可以实现您的目标。我只是使用所有时区填充表格或视图,然后根据该时区是否进行处理您的夏令时。