在将我们从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 执行此操作,并采用NAME
which 引用#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