我是SQL Server 2008的新手。任何幫助都非常感謝。如果我寫的存儲過程是耗時的因素,那麼有人可以幫助我以更好的方式編寫代碼。在循環函數的同時,錯誤:超過了最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)
Table Name: tblProduct
Column Names: Product No, S1_CR, S1_CAT1, S1_CAT2, S1_CAT3, S1_CAT4
Eg Column Values: 1234, Prod1#Prod2#Prod3, 10#200#300, 20#34#400, 40#12#12, 50#23#12
我試圖填充表,即會顯示像(當輸入爲Prod2的),
1234 Prod2 200 34 12 23
以下錯誤顯示出來,同時執行以下存儲過程。
錯誤:超過了最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)。
存儲過程有一個函數(instr),該函數被調用來查找字符串中散列出現的次數以幫助填充表。
存儲過程:
Alter Procedure spPopulate
@Code varchar(10),
@Test int,
@Product varchar(10),
@Year varchar(4)
as
Begin
Declare @Pos int
select @Pos = LEN(SUBSTRING(S1_CR, 0, CHARINDEX(@Code, S1_CR, 0))) - LEN(REPLACE(SUBSTRING(S1_CR, 0, CHARINDEX(@Code, S1_CR, 0)), '#' , '')) from tblProduct where Product [email protected] and Year = @Year
select ProductNo, s1_cr, s1_cat1, S1_CAT2, S1_CAT3, S1_CAT4,
case
when @Test >= 1 then right(LEFT(s1_CAT1, dbo.INSTR(S1_CAT1+ '#', '#', 1, @Pos+1)-1), (dbo.INSTR(S1_CAT1+ '#', '#', 1, @Pos+1)-1)- (dbo.INSTR(S1_CAT1+ '#', '#', 1, @Pos)+1)+1) end as CAT1,
case
when @Test >= 2 then right(LEFT(s1_CAT2, dbo.INSTR(S1_CAT2+ '#', '#', 1, @Pos+1)-1), (dbo.INSTR(S1_CAT2+ '#', '#', 1, @Pos+1)-1)- (dbo.INSTR(S1_CAT2+ '#', '#', 1, @Pos)+1)+1) end as CAT2,
case
when @Test >= 3 then right(LEFT(s1_CAT3, dbo.INSTR(S1_CAT3+ '#', '#', 1, @Pos+1)-1), (dbo.INSTR(S1_CAT3+ '#', '#', 1, @Pos+1)-1)- (dbo.INSTR(S1_CAT3+ '#', '#', 1, @Pos)+1)+1) end AS CAT3,
case
when @Test >= 4 then right(LEFT(s1_CAT4, dbo.INSTR(S1_CAT4+ '#', '#', 1, @Pos+1)-1), (dbo.INSTR(S1_CAT4+ '#', '#', 1, @Pos+1)-1)- (dbo.INSTR(S1_CAT4+ '#', '#', 1, @Pos)+1)+1) end AS CAT4
from Product where [email protected] and Year = @Year ;
End
Execute spPopulate @Code = 'Prod1', @Product= 'ProductName1', @Year = '2010', @Test = 1
請找到函數低於INSTR
ALTER FUNCTION [dbo].[INSTR] (@str VARCHAR(8000), @substr VARCHAR(255), @start INT, @occurrence INT)
RETURNS INT
AS
BEGIN
DECLARE @found INT = @occurrence,
@pos INT = @start;
WHILE 1=1
BEGIN
-- Find the next occurrence
SET @pos = CHARINDEX(@substr, @str, @pos);
-- Nothing found
IF @pos IS NULL OR @pos = 0
RETURN @pos;
-- The required occurrence found
IF @found = 1
BREAK;
-- Prepare to find another one occurrence
SET @found = @found - 1;
SET @pos = @pos + 1;
END
RETURN @pos;
END
字符串處理往往很慢....特別是如果你寫一個InStr函數()方法,如果適用於所有或許多行...你可以經常更換與LIKE –
它看起來像正確的解決方案是一個更好的數據結構。使用散列來分離值,然後嘗試使用查詢拆分它們違背了關係數據庫的目的。您將通過更好的數據結構來解決遞歸錯誤和速度問題。 – Lathejockey81
100%同意@ Lathejockey81:標準化。 –