簡體   English   中英

帶文字的存儲過程參數在SQL Server 2008 R2中不起作用

[英]Stored procedure parameters with literals not working in SQL Server 2008 R2

我有一個存儲過程,需要兩個參數作為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事件探查器后,我確認正在執行相同的代碼:

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實例上具有字符串文字的結果集,但是在那里正確地工作了呢?

這可能不是確切的答案,但是請嘗試以此作為更多了解問題的方法。 使用適當的參數在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版本不會自動轉換)。 EG:如果數據以數字數據類型存儲在表中,則可以將012345678轉換為12345678。 但是嘗試在沒有存儲過程和/或臨時表的情況下隔離行為,這可能有助於縮小可能的原因...

您沒有發布Table 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,則可能導致此錯誤:

以int開頭的前導零將被刪除,並且在轉換為varchar時,結果字符串不包含前導零。

還不清楚表中的數據如何影響代碼中的執行(IF語句!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM