として 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 インスタンスに配置された文字列リテラルを含む結果セットを返さないが、それらがなくても正しく動作する原因は何ですか?