对于具有不同列(针对不同版本)的相同表的相同查询?

url*_*der 1 sql sql-server sql-server-2008

针对不同架构的相同查询?

嗨,

我有一个问题.它在表中查询某些数据.但是,由于数据库有2个不同版本,因此表列已更改.例如:

对于版本#1,table1具有列:id,value,版本#2的名称,table1具有列:id,value,title

(当它是#2时,数据库中有一个新的table2.我用它来决定它是#1还是#2.)

现在,我需要编写一个查询以在一个查询中适应两个版本.

            IF OBJECT_ID('dbo.table2', 'U') IS NULL
            BEGIN
                -- version #1
                SELECT *
                FROM table1 t1 INNER JOIN table3 t3 on t1.Name = t3.Name ......
                ...

            END
            ELSE
            BEGIN
                -- version #2
                SELECT *
                FROM table1 t1 INNER JOIN table3 t3 on t1.title = t3.Name ......
                ...
            END
Run Code Online (Sandbox Code Playgroud)

当我为版本#2运行它时,它报告错误:t1.Name无效的列名.

我想可能,我可以使用EXEC来解决这个问题.有没有更优雅的方式来做到这一点?

我试过TRY CATCH,它仍然报告同样的错误.

我发现的奇怪的事情是:我有另一个查询,它确实:

1)创建临时表#Ldap 2)使用openquery(对于活动目录)将一些数据插入临时表#Ldap.3)然后使用上述逻辑来确定它是版本#1还是#2.

虽然它在管理工作室的编辑器中突出显示t1.Name为错误,但它工作正常.它不报告是错误.

这让我想知道:SQL是否首先编译整个查询?要不然?

谁知道解决方案?

谢谢

Aar*_*and 5

SQL将尝试解析和评估所有列引用.您可以通过引用不存在的表(延迟名称解析)来逃避,但是您无法使用表中不存在的列.解析器不关心您IF和其他条件逻辑在运行时可能会产生什么.这就是为什么你不能这样做的原因:

IF (1=1)
  CREATE TABLE #foo...
ELSE
  CREATE TABLE #foo...
Run Code Online (Sandbox Code Playgroud)

即使ELSE可能永远不会运行,解析器也会阻止这么简单的事情.

是的,解决这个问题的方法是动态SQL(或者首先是更稳定的设计).