2012-12-11 72 views
1

我創建已經在表中(CandidatosVestAtual)候選人的程序(sp_ET1_ClassificacaoPPIInferior)按分數(Numr_TotalEt1)排序特定類別(TipoPrograma = 1):程序在SQL Server 2008中

CREATE TABLE [dbo].[CandidatosVestAtual](
[NUMG_Candidato] [bigint] NOT NULL, 
[CODG_Curso] [varchar](4) NOT NULL, 
[TipoPrograma] [int] NOT NULL, 
[Numr_TotalEt1] [int] NULL, 
[Numr_Classificacao_PPIInf_Et1] [int] NULL, 

    CONSTRAINT [PK_CandidatosVestAtual_1] PRIMARY KEY CLUSTERED ([NUMG_Candidato] ASC) 
) 

遵循程序的代碼使用:

ALTER PROCEDURE [dbo].[sp_ET1_ClassificacaoPPIInferior] @CODG_Curso varchar(4) 
AS 

DECLARE @Cnt INT 
DECLARE @NUMG_Candidato INT 

    DECLARE Candidatos_C CURSOR FOR 


    SELECT NUMG_Candidato 
    FROM CandidatosVestAtual 
    WHERE TipoPrograma in (1) AND 
    Codg_Curso [email protected]_Curso 
    ORDER BY Numr_TotalEt1 DESC 



    set @Cnt = 1 
    OPEN Candidatos_C 
    FETCH NEXT FROM Candidatos_C INTO @NUMG_Candidato 
     WHILE (@@FETCH_STATUS = 0) 
     BEGIN 


     UPDATE CandidatosVestAtual SET [email protected] 
     FROM CandidatosVestAtual 
     WHERE [email protected]_Candidato 

     SET @Cnt = @Cnt + 1 
     FETCH NEXT FROM Candidatos_C INTO @NumG_Candidato 
     END 

    CLOSE Candidatos_C 
    DEALLOCATE Candidatos_C 

然而,這個程序沒有做任何事情,因爲它代表。當我改變了原來的查詢程序這只是做了一些事情:

SELECT NUMG_Candidato 
FROM CandidatosVestAtual 
WHERE TipoPrograma in (1) 
    AND Codg_Curso = @ CODG_Curso 
ORDER BY DESC Numr_TotalEt1 

通過

SELECT NUMG_Candidato 
FROM CandidatosVestAtual 
WHERE Codg_Curso = @CODG_Curso 
ORDER BY DESC Numr_TotalEt1 

我怎樣才能使與原來的查詢程序工作?

+0

您確定該表中的記錄與原始查詢匹配嗎?如果刪除其中的一個條件,然後運行,則應該告訴您問題出在數據上。 –

+0

另外,你應該考慮用一個基於集合的操作替換這個遊標......這很容易用ROW_NUMBER()函數重新實現。 –

+0

當你運行'SELECT NUMG_Candidato FROM CandidatosVestAtual WHERE TipoPrograma in(1)' ? – Beth

回答

0

問題是VARCHAR和VARCHAR(6),請檢查您的PROC peremeter是@CODG_Curso VARCHAR(6)和表模式場DEF是[CODG_Curso] VARCHAR NOT NULL ..

+0

我敢肯定有在對應於原始查詢表數據的建議,例如,剛剛運行的查詢:SELECT NUMG_Candidato FROM CandidatosVestAtual WHERE TipoPrograma在(1)和 Codg_Curso =' A105' ORDER BY DESC Numr_TotalEt1 並返回記錄。但是,當我運行該程序時,什麼都沒有完成:運行dbo.sp_ET1_ClassificacaoPPIInferior'A105'; –

+0

使用peremeter修改過程@CODG_Curso varchar(4)然後嘗試它。 使用像instade =在哪裏clase .. – Hiten004

+0

使用peremeter修改過程@CODG_Curso varchar(4)但沒有工作 –

0

我創建使用

一些假的數據
declare @i int = 1 
while @i <= 100 
Begin 
insert into [CandidatosVestAtual] 
(NUMG_Candidato, 
CODG_Curso, 
TipoPrograma, 
Numr_TotalEt1, 
Numr_Classificacao_PPIInf_Et1) 
select @I, 'a', 1, 1 

end 

當運行過程

[dbo].[sp_ET1_ClassificacaoPPIInferior] 'a' 

在Numr_Classificacao_PPIInf_Et1的數據被幹淨地遞增。從您的觸發器中刪除更新並替換爲選擇的

select @Cnt, @NUMG_Candidato 

如果這樣會增加數據;你陷入事務性回滾?如果它不能評論/修剪,直到它工作,並說出它開始再次工作的地方?

+0

感謝您的建議,現在的工作。 –