2013-05-09 67 views
0

我有我CaseFilescsfl_CaseNo列數據號是使用存儲過程在SQL Server 2005中

00001/13-14 
00002/13-14 
00003/13-14 
00004/13-14 
00005/13-14 

這裏是我的存儲過程來增加數量

ALTER PROCEDURE [dbo].[HLA_CaseNo](@strFnyr as nvarchar(5),@strSuffix as nvarchar(15) OUTPUT) 
AS 
BEGIN 
--Declarations 
declare @strSuffix1 as nvarchar(15) 
declare @strTmp as nvarchar(5) 
declare @intNew as int 
--declare @strSql as nvarchar(2000) 
set @strSuffix1 = null 
    --Process 
begin 
    set @strSuffix1 = (select max(csfl_caseNo) from CaseFiles where csfl_Fynyr = @strFnyr) 
    --set @strPrf='QUT' 
end 

if @strSuffix1 is null 
    set @intNew = 1 
else 
    set @intNew = cast(substring(@strSuffix1,0,5) as int) + 1 

print 'The value of intNew ' + cast(@intNew as nvarchar(10)) 
set @strTmp = cast(@intNew as nvarchar(5)) 
set @strTmp = (select replicate('0',5-len(@strTmp)) + @strTmp) 
set @strSuffix = @strTmp + '/' + @strFnyr 

END

不增加

我的任務是當我通過財政年度爲13-14它必須返回值爲00006/13-14,但它是ret改爲使用00002/13-14

爲什麼會發生這種情況?請幫助

+2

除了現有的錯誤,你也有一個多用戶問題。當兩個不同的用戶調用這個存儲過程時,他們將被分配相同的編號。如果您使用的是SQL Server 2012,請改用「SEQUENCE」。如果您使用的是早期版本,請使用「IDENTITY」。關於你的bug,不知道'csfl_Fynyr'字段裏有什麼是沒有人能幫到的。同時,爲什麼不使用'PRINT'或'SELECT'來回顯所有的變量值並檢查它們。你可能有一個偏移錯誤或什麼的。 – 2013-05-09 04:15:41

回答

2

變化

set @intNew = cast(substring(@strSuffix1,0,5) as int) + 1 

set @intNew = cast(substring(@strSuffix1,1,5) as int) + 1 

甚至寧願用

LEFT(@strSuffix1,5) 

而不是

substring(@strSuffix1,1,5) 

所以,像

set @intNew = cast(LEFT(@strSuffix1,5) as int) + 1 

SUBSTRING (Transact-SQL)

開始

是指定在返回 字符開頭的整數或BIGINT表達。如果start小於1,則返回的表達式 將從expression中指定的第一個字符開始。 在這種情況下,返回的字符數是開始長度-1或0的最大值。如果起始 大於值表達式中的字符數,則返回一個零長度表達式 。

因此,這將意味着start + length- 1 = 0 + 5 - 1 = 4,這將意味着cast(substring(@strSuffix1,0,5) as int)爲0,set @intNew = cast(substring(@strSuffix1,0,5) as int) + 1 = 1

+0

好眼睛,很好的解釋。 – J0e3gan 2013-05-09 04:22:58

+0

謝謝先生..得到它 – 2013-05-09 04:31:00

0

我敢打賭,...

set @strSuffix1 = (select max(csfl_caseNo) from CaseFiles where csfl_Fynyr = @strFnyr) 

...是@ strSuffix1設置爲null因爲沒有CaseFiles記錄where csfl_Fynyr = @strFnyr

檢查您是否正在修整csfl_Fynyr@strFnyr(如果適用) - 可能與您錯過的尾部空白不匹配。

要調試只是聲明,需要要傳遞的@strFnyr值,並在聲明中,在單引號替換爲值@strFnyr:自身運行它,看你是否真正得到一個max(csfl_caseNo)值回。

+1

對不起,先生.....我有一個csfl_Fynyr領域有13-14 ..和@ strSuffix1不返回到NULL ..它正在取最大值正確 – 2013-05-09 04:25:39

+0

感謝您的現實檢查。這只是最初站到我面前的可能性。 – J0e3gan 2013-05-09 04:27:55

+0

明白了..謝謝 – 2013-05-09 04:30:03

0

你可以把它與一個說法更簡潔

SELECT RIGHT('0000' + CAST(LEFT(MAX(csfl_CaseNo), 5) + 1 AS VARCHAR(5)), 5) + '/13-14' 
    FROM CaseFiles 
WHERE RIGHT(csfl_CaseNo, 5) = '13-14'; 

然後你的SP可能看起來像

CREATE PROCEDURE HLA_CaseNo(@strFnyr as nvarchar(5), @strSuffix as nvarchar(15) OUTPUT) 
AS 
SELECT @strSuffix = RIGHT('0000' + CAST(LEFT(MAX(csfl_CaseNo), 5) + 1 AS VARCHAR(5)), 5) + '/' + @strFnyr 
    FROM CaseFiles 
WHERE RIGHT(csfl_CaseNo, 5) = @strFnyr; 

SQLFiddle

相關問題