SQLServer2000からSQLServer2008 R2に継承した一連のアプリケーションを移行しているときに、現在失敗するORDERBYスタイルに遭遇しました。
クエリは一種の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
を参照し#NAMETABLE.NAME
ます。SQL Server2008R2が「無効な列名'NAME'」で失敗します。
いくつかの質問:
- SQL Server 2008 R2にこの種のクエリを受け入れさせ、SQL Server 2000の動作を実行させることは可能ですか(SQL生成レイヤーを修正し、それに対してリグレッションを実行できるようにするため)?
- この種のクエリが失敗するSQLServerのバージョンは何ですか?
- 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