0

我有一个存储过程,它接受两个参数作为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 实例上的字符串文字的结果集,但在没有它们的情况下正常工作?

4

2 回答 2

2

这可能不是确切的答案,但可以尝试以此作为了解更多问题的方法。在 SSMS 中运行一些基本查询(不是整个过程),并使用适当的参数,例如:

(我不确定 @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 版本不会自动转换)。EG:如果数据作为数字数据类型存储在表中,则 012345678 可以转换为 12345678。但是尝试在没有存储过程和/或临时表的情况下隔离行为,这可能有助于缩小可能的原因......

于 2012-07-02T14:49:47.177 回答
2

您没有发布表 Books 的表定义,但是

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

如果 BookNumber 和 BookDate 是数字而不是 varchar,可能会导致:

整数中的前导零被删除,当转换为 varchar 时,结果字符串不包含前导零。

也不清楚表中的数据如何影响代码中的执行(IF 语句!)。

于 2012-07-02T17:16:15.057 回答