none
SQL Server 2000 と 2005 の挙動の違いについて RRS feed

  • 質問

  • こんにちは。

    元々 C#の ADO.NET で SQL Server 2000 にアクセスするプログラムがありました。

    このプログラムは正常に動作しています。

     

    この、SQL Server 2000 を SQL Server 2005 へアップデートするべく検証を行なっているのですが

    下記の現象が出て困っています。

     

    現象というのは、SQL Server 2000 にアクセスした時、プロファイラでは下記のような

    クエリが実行されます。

    exec sp_executesql N'INSERT INTO table(DatDate, Cd) VALUES(@DatDate, @Cd)',N'@DatDate datetime,@Cd nchar(4000)',@DatDate='05 30 2006 12:00 AM' ,@CD=N'99999'

    同じプログラムにて SQL Server 2005 にアクセスした際、プロファイラでは、

    exec sp_executesql N'INSERT INTO table(DatDate, Cd) VALUES(@DatDate, @Cd)',N'@DatDate datetime,@Cd nchar(4000)',@DatDate=''2006-05-30 00:00:00:000'',@CD=N'99999'

    のように、Datatime型のパラメータの値の前後に引用符 (') がなぜか2つついてしまい、

    クエリの実行ができません。

    (メッセージ 102、レベル 15、状態 1、行 1 '2006' 付近に不適切な構文があります。 となります)

    この時、SQL Server 2005 側では、引用符が2重に付けられるのが問題かと思いますが、

    プログラムは全く同じものを使用している為、SQL Server 2005 側の設定か、調整が必要かと

    思って調べてみましたが、解決できませんでした。

     

    このような現象を解決する方法をアドバイスください。よろしくお願いします。


     

     

    2006年5月30日 8:52

すべての返信

  • プロファイラの結果も大事ですが、実際のコードを出してください。

    'クォートつきで文字列で設定とかしてしまっていませんか?

    2006年5月30日 10:37
  • すみません。自己解決しました。

    プロファイラで拾っていた SQL 文はこれで正しいようです。

    ' が 2重になっている状態でも SQL の実行はされていました。

    ちなみにプログラムは抜粋ですが

    DateTime datDate;

    cmd = new SqlCommand(sql, con, trans);

    cmd.Parameters.Add(new SqlParameter("@DatDate", SqlDbType.DateTime);

    cmd.Parameters["@DatDate"].Value = datDate;

    のようにしていますので、プログラムでクォートしているような事はありません。

    この状態でプロファイラがはきだす SQL は ' が2重になっています。

    この行でロールバックがかかっていたのでこの SQL が悪いとずっと考えていたのですが

    いろいろ調べたところ、(お恥かしい事に)このテーブルのトリガに不具合をみつけました。

    SQL Server 2000 では、この状態でもエラーを返さずに動作しているようで、SQL Server 2005 だと

    それを正しくエラーとしてくれていたようです。SQL Server 2005 にしたから、ではありませんでした。

    大変失礼致しました。

    表題の件とは異なるのですが、プロファイラがはきだす SQL だと、' が2重になる事によって、

    このスクリプトをそのままコピペして

    SQL Server Management Studio のクエリ(SQL Server 2000 のクエリアナライザみたいな)に

    流す事はできないのですが、プロファイラの出力した SQL をクエリとして実行するのは

    現状手間なのですが、何かいい方法があれば教えてください。

    よろしくおねがいします。

    2006年5月30日 10:48
  • 再現確認していませんが、どの環境でも出るならプロファイラの日付の表現の問題っぽく思いますね。
    2006年5月30日 13:16