スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
拍手コメントを見る

SQL : View の中で ORDER BY

2010/08/06 更新:本件はこれで修正されたようです。
以下の文書は、修正されるまでにどれだけ苦しんだか忘れないように残しておきます。:-)


以下、オリジナル本文

Microsoft SQL Server 2005 では、
「VIEW の中で ORDER BY しても正しいソートを保障しない」という記事を見ました。
記事は→こちら

SQL Server 2000 では正しい結果が返っていたのに、、です。

自分の環境では全くでなかった問題が、他の環境ででてしまったのですが、この「仕様変更」にたどり着くまで、偉く時間が掛かってしまいました。

SQL Server 2005 のリリース後にドキュメントが改定されて、「保障されません」という文面がメモとして追加されていました。

ほぉ、「保障しない」ってどういう事ですか?

現象からすると
ある環境で「正しく」表示されていたのは「たまたま」で、
ある環境で「異常に」表示されていたのも「たまたま」という事になります。

それが「仕様」なのだと。

・・・・困るんです。非常に。

さらに、「VIEW の中で ORDER BY を使いたい場合は、TOP 句 を入れる必要がある」と書かれています。実際に TOP 句なしで実行するとエラーが返ってきます。TOP 句を入れると実行してもエラーはでません。

で、

その結果は「保証しない」んです。

なんすか?それ。

記事、色々探してみたところ、世界各国でチラホラとこの問題に気がついた人たちが居たらしく、2種類の方法が出ていました。

1つは、TOP に添える値に、BIGINT の MAX (とにかくデカイ数字)を入れる。
これ、パフォーマンスが悪いだけでなく、結果もダメでした。

もう1つは、TOP に添える値に、99 PERCENT と入れる。
おぉ!これはっ!
あれ?100件のレコードがあると1件無視しちゃいますよね、コレ。

ならば、99.9 PERCENT と入れてみると、対象が100件になりました。結果も正しそうです。
ただし、添える値が既存のレコード数に左右されます。
例えば、4桁のレコードに対しては、99.99 PERCENT としないとダメって事になります。

ただし、VIEW の中では変数が宣言できない。つまり動的に数値を決めることはできない。ということで、予めありえそうもない99.999...を埋め込んでおく事になるだろうと予想がつきます。

で、いろいろなレコードを対象にして PERCENT で実験してみたのですが、やっぱり駄目な場合がありました。

がっかり。

要するに、やっぱり、なんといっても、
「保証しない」
んですね。

ロジック書き直しです。
と言っても担当は僕じゃなく、他の人なんですけど。

同じ問題で悩んでいる方へ。
ワークアラウンドはありません。
あっさり、すっきり、VIEW の中の TOP ~ ORDER BY は諦めたほうが良いです。
今、うまく動いていても、いつその結果に裏切られるかわかりませんよ。 拍手コメントを見る

テーマ : プログラミング
ジャンル : コンピュータ

コメント

なんじゃ?

 いちおう読んでみたが、訳わからんかった。なんちゅう世界におるんじゃろうか。まあ、元気そうで何より。

うわっ!

あきさん、すみません!オペミスでコメント消しちゃいました!

えと、hotfixも試しましたが、駄目だったんですよ。

しかも、2000モードで誤魔化す方法なんで、それはそれで問題があるんですね。

これは、、、

消えたのはぜんぜん OK です。
そっか、よく読むと 2000 モードですな。だから駄目ですね。

データベース屋さんからすると、これは酷いですな。
実際のシステムを考えるとビューはほとんど使用不可能ですな、こりゃ。

そなの

あきさん、
書き換えるVIEWの数もさることながら、関連するソースを考えると涙でちゃいますよ。

TJ兄者、
はい、分かりやすい世界で勝負したいんですけどね~(笑)

本件修正されました

ここに修正記事があります。
http://support.microsoft.com/kb/926292/ja

試していませんけど。。
非公開コメント
ブログ内検索
プロフィール

雷ぶ

Author:雷ぶ

最近の記事
最近のコメント
最近のトラックバック
カテゴリー
月間アーカイブ
ブロとも申請フォーム

この人とブロともになる

RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。