0

として 2 つのパラメーターを受け取るストアド プロシージャがありますvarchar(50)。ストアド プロシージャは一時テーブルに対していくつかの簡単なクエリを実行し、一時テーブルから結果セットを返します (実際のクエリは削除しました)。

ALTER PROCEDURE [dbo].[cv_GetBooks]
    @bookNumber as varchar(50),
    @bookDate as varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    --a few select statements

    if @ismultiple = '0'
    begin
         select * from books where bookNumber = @bookNumber
    and bookDate = @bookDate
    and Bookname is  not null
    end
    ELSE
    Begin
        select * into #temp from books
    where bookNumber = @bookNumber
    and bookDate = @bookDate
    and Bookname is   null

           select * from books
    where bookauthor not in (select bookauthor from #temp) 
    and bookNumber= @bookNumber
            and bookDate= @bookDate
        drop table #temp
    end
END

このクエリを SQL Server 2008 のローカル開発マシンにインストールしました。また、Windows Server 2003 と SQL Server 2008 を実行している 2 台のテスト マシンにもインストールしました。ストアド プロシージャは期待どおりに動作しています。

cv_GetBooks '012345678', '06062012' --returns result set as expected

最近、Windows Server 2008 と SQL Server 2008 R2 を実行している別のリモート環境のテスト サーバーに移動しました。ストアド プロシージャが期待どおりに機能しなくなりました。SQL Profiler を実行した後、同じコードが実行されていることを確認しました。

cv_GetBooks '012345678', '06062012' --run on SQL server 2008 r2 returns nothing

クエリから引用符を削除すると、期待どおりの結果が得られました。

cv_GetBooks 012345678, 06062012 --run with out quotes server returns expected result set

それ以来、同じストアド プロシージャをローカル バージョンの SQL Server 2008 R2 にインストールしましたが、最初の例のようにリテラル文字列の引用符が配置され、すべてが期待どおりに実行されています。

最初は、渡されたパラメーターのエスケープの問題だと思っていましたが、渡された値に一重引用符が含まれていないため、正しくないようです。

非常に多くの環境にインストールして動作させたので、これはおそらく私が知らない SQL Server の設定であるという印象を受けました。

ストアド プロシージャが、SQL Server 2008 r2 インスタンスに配置された文字列リテラルを含む結果セットを返さないが、それらがなくても正しく動作する原因は何ですか?

4

2 に答える 2

2

これは正確な答えではないかもしれませんが、問題の詳細を調べる方法としてこれを試してください。次のようなパラメーターを使用して、SSMS でいくつかの基本的なクエリ (proc 全体ではない) を実行します。

( @ismultiple がどこから来たのかわかりません-宣言またはパラメーター化されていないようです?)

select * 
from books
where bookNumber = '012345678'
and bookDate = '06062012'
and Bookname is null

select * 
from books
where bookNumber = 012345678
and bookDate = 06062012
and Bookname is null

同じ結果が得られますか? どのような結果が得られますか?

私の疑いはデータ型です。どこかで何かが変換されているため、ある環境では機能せず、別の環境で機能します (データ型が異なるか、SQL バージョンが自動的に変換されない場合)。例: データが数値データ型としてテーブルに格納されている場合、012345678 は 12345678 に変換される可能性があります。ただし、ストアド プロシージャや一時テーブルを使用せずに動作を分離してみてください。これにより、考えられる原因を絞り込むことができます...

于 2012-07-02T14:49:47.177 に答える