1

在将我们从SQL Server 2000继承的一堆应用程序迁移到SQL Server 2008 R2时,我遇到了一种现在失败的ORDER BY样式。

查询是由一种 SQL 生成层生成的(如果它更好,会尽快修复该层,但它很糟糕)。如果可能的话,我想推迟修复 SQL 生成层,直到我为它构建了一个像样的测试工具。

小例子(无论您使用哪种表:常规或本地/全局临时表):

select
  #IDTABLE.*,
  #NAMETABLE.NAME as NAME -- column alias is mandatory for SQL Server 2000 to succeed
from #IDTABLE
left join #NAMETABLE on #IDTABLE.ID = #NAMETABLE.ID
order by #IDTABLE.NAME

罪魁祸首是#IDTABLE没有NAME列。SQL Server 2000 执行此操作,并采用NAMEwhich 引用#NAMETABLE.NAME. SQL Server 2008 R2 失败并显示“列名 'NAME' 无效”。

几个问题:

  • 是否可以强制 SQL Server 2008 R2 接受这种查询并执行 SQL Server 2000 的行为(这样我们就可以修复 SQL 生成层,并对其执行回归)?
  • 因为这种查询失败的 SQL Server 版本是什么?
  • 为什么 SQL Server 2000 会愉快地接受这种查询?

如果您想查看行为,这里有一个完整的示例:

create table #IDTABLE (
    ID Integer
)

create table #NAMETABLE (
    ID Integer,
    NAME VarChar(50)
)

insert into #IDTABLE values (0)
insert into #IDTABLE values (1)
insert into #IDTABLE values (2)

insert into #NAMETABLE values (0, 'FOO')
insert into #NAMETABLE values (1, 'BAR')
insert into #NAMETABLE values (2, 'SNAFU')

select *
from #IDTABLE

select *
from #NAMETABLE

select
  #IDTABLE.*,
  #NAMETABLE.NAME as NAME -- NAME alias is mandatory for SQL Server 2000 to succeed
from #IDTABLE
left join #NAMETABLE on #IDTABLE.ID = #NAMETABLE.ID
order by #IDTABLE.NAME

drop table #IDTABLE
drop table #NAMETABLE

OSQL的输出:

(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
 ID
 -----------
           0
           1
           2

(3 rows affected)
 ID          NAME
 ----------- --------------------------------------------------
           0 FOO
           1 BAR
           2 SNAFU

(3 rows affected)
 ID          NAME
 ----------- --------------------------------------------------
           1 BAR
           0 FOO
           2 SNAFU
4

1 回答 1

4

您可以暂时将其破解为“工作”:

ALTER DATABASE [your database] SET COMPATIBILITY_LEVEL = 80;

但是,您最好在升级到 SQL Server 2012 之前修复您的生成层以生成有效的 SQL,因为该兼容级别不再有效,并且在 90 及以上代码中断。别介意将数据库设置为 80 可能会产生其他不良副作用 - 我在这里讨论它们:

SQL Server 2000 到 2008 迁移 - 使用 DISTINCT 时出现 ORDER BY 问题

(顺便说一句,如果##IDTABLE没有NAME列,为什么它##IDTABLE.NAME首先会生成?)

于 2013-02-28T15:54:37.010 回答