1

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がないことです。NAMESQL 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
4

1 に答える 1

4

これをハックして一時的に「機能」させることができます。

ALTER DATABASE [your database] SET COMPATIBILITY_LEVEL = 80;

ただし、SQL Server 2012にアップグレードする前に、生成レイヤーを修正して有効なSQLを生成することをお勧めします。これは、その互換性レベルがそこで有効でなくなり、90以上でコードが破損するためです。データベースを80に設定すると、他の望ましくない副作用が発生する可能性があることを気にしないでください。ここでそれらについて説明します。

SQLServer2000から2008への移行-DISTINCT使用時のORDERBYの問題

(余談ですが、コラム##IDTABLEがないのに、そもそもなぜそれが生成されているのでしょうか?)NAME##IDTABLE.NAME

于 2013-02-28T15:54:37.010 に答える