我有一个存储过程,它接受两个参数作为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 的两台测试机器上安装了它。存储过程一直按预期工作。
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 实例上的字符串文字的结果集,但在没有它们的情况下正常工作?