2017-09-25 2 views
0

Monsieur,SQL curseur à insérer dans le tableau temporaire et rapportez de Temparory Tableau

J'ai construire une requête SQL à l'aide du curseur comme @AllRecords pour insérer des valeurs dans le tableau & temporaire puis Fetch les valeurs de cette table temporaire. Mais il me montre une erreur lors de la dernière déclaration lorsque je récupère des valeurs de la table (Erreur: syntaxe incorrecte près de @AllRecords). Ci-dessous mon code:

DECLARE @ColName varchar(20)=null, 
     @Query varchar(MAX)=null, 
     @DepartmentName varchar(50)=null, 
     @deptt_code varchar(4)=null, 
     @DistrictId varchar(4)='0001', 
     @Deptt_Id char(4)=null, 
     @stYear varchar(4)=null, 
     @cYear varchar(4)=null, 
     @yr varchar(9)='2017-2018', 
     @tno int 

BEGIN 
     set @stYear = SUBSTRING(@yr,0,5) 
     set @cYear = SUBSTRING(@yr,6,4) 

--DECLARE & SET COUNTER 
DECLARE @counter int 
SET @counter = 1 

--CREATE DYNAMIC TABLE WITH COLs 
DECLARE @AllRecords table 
(
    department_name varchar(50), 
    project_name varchar(100), 
    department_code varchar(4) 
) 

--*** Declare Cursor 
DECLARE cur_FetchDepartmentName CURSOR READ_ONLY 
FOR 
    select deptt_code,deptt_name+'('+ RTRIM(LTRIM(deptt_short))+')' as dept_name from m_Department 
    where deptt_code in (select distinct department_code from t_Project_Details where [email protected] 
    and [email protected]) 

OPEN cur_FetchDepartmetName 

fetch next from cur_FetchDepartmetName into 
@deptt_code, @DepartmentName 

--LOOP UNTIL RECORDS ARE AVAILABLE 
while @@FETCH_STATUS=0 
    BEGIN 
     if(@tno=0) 
      BEGIN 
       set @tno=1 
       insert into @AllRecords values(@DepartmentName,@deptt_code) 
       fetch next from cur_FetchDepartmetName into 
       @deptt_code,@DepartmentName 
      END 
     else 
      BEGIN 
       set @[email protected]+1 
       insert into @AllRecords values(@DepartmentName,@deptt_code) 
       fetch next from cur_FetchDepartmetName into 
       @deptt_code,@DepartmentName 
      END 

    END 
     --CLOSE CURSOR 
     CLOSE cur_FetchDepartmetName 
     DEALLOCATE cur_FetchDepartmetName 

    select department_name, department_code from @AllRecords 
+1

Si vous définissez vos premières variables, vous avez ' BEGIN' qui n'a pas de 'END' associé – HoneyBadger

+0

Ceci doit être le meilleur exemple d'utilisation inutile des curseurs. S'il vous plaît, arrêtez, respirez et réécrivez ceci comme une simple instruction INSERT..SELECT. Je dirais d'utiliser ROW_NUMBER() ou IDENTITY() pour obtenir @tNo, mais je ne vois pas de point, vous ne les utilisez plus? –

Répondre

0

au lieu de répondre ce qui est une erreur dans cette solution, je voudrais offrir une meilleure solution au problème. L'utilisation du curseur dans cet exemple est complètement inutile, la requête peut être plus facilement écrite sans elle. C'est une instruction INSERT..SELECT simple et le comptage des enregistrements pour définir @tno peut facilement être fait à la fin.

BEGIN 

set @stYear = SUBSTRING(@yr,0,5); 
set @cYear = SUBSTRING(@yr,6,4); 

--CREATE DYNAMIC TABLE WITH COLs 
DECLARE @AllRecords table 
(
    department_name varchar(50), 
    project_name varchar(100), --what's the use of this column? 
    department_code varchar(4) 
); 

INSERT INTO @AllRecords (department_code, department_name) 
select deptt_code,deptt_name+'('+ RTRIM(LTRIM(deptt_short))+')' as dept_name from m_Department 
    where deptt_code in (select distinct department_code from t_Project_Details where [email protected] 
    and [email protected]); 


SELECT @tNo = COALESCE(@tno,0) + COUNT(*) FROM @AllRecords; 

select department_name, department_code from @AllRecords; 

END 

S'il vous plaît vérifier cet article sur les curseurs et comment les éviter:

Cursors and How to Avoid Them

+0

Monsieur, 'nom de projet varchar (100)' cette colonne est pour une autre table de projet qui a des détails de projet et également téléchargés sous département correspondant. –

+0

En fait, je dois aller chercher chaque département et aussi aller chercher les projets correspondant à ce département à partir de la table des projets –

+0

@SumeetKumar Quel que soit le problème, les curseurs ne sont probablement pas nécessaires –

0

Votre requête SQL comme ci-dessous:

BEGIN 
     DECLARE @ColName VARCHAR(20)= NULL, @Query VARCHAR(MAX)= NULL, @DepartmentName VARCHAR(50)= NULL, @deptt_code VARCHAR(4)= NULL, @DistrictId VARCHAR(4)= '0001', @Deptt_Id CHAR(4)= NULL, @stYear VARCHAR(4)= NULL, @cYear VARCHAR(4)= NULL, @yr VARCHAR(9)= '2017-2018', @tno INT; 
     SET @stYear = SUBSTRING(@yr, 0, 5); 
     SET @cYear = SUBSTRING(@yr, 6, 4); 

--DECLARE & SET COUNTER 
     DECLARE @counter INT; 
     SET @counter = 1; 

--CREATE DYNAMIC TABLE WITH COLs 
     DECLARE @AllRecords TABLE 
     (department_name VARCHAR(50), 
      project_name VARCHAR(100), 
      department_code VARCHAR(4) 
     ); 

--*** Declare Cursor 
     DECLARE cur_FetchDepartmentName CURSOR READ_ONLY 
     FOR 
      SELECT deptt_code, 
        deptt_name+'('+RTRIM(LTRIM(deptt_short))+')' AS dept_name 
      FROM m_Department 
      WHERE deptt_code IN 
      (
       SELECT DISTINCT 
         department_code 
       FROM t_Project_Details 
       WHERE district_id = @DistrictId 
         AND financial_year = @yr 
      ); 
     OPEN cur_FetchDepartmetName; 
     FETCH NEXT FROM cur_FetchDepartmetName INTO @deptt_code, @DepartmentName; 

--LOOP UNTIL RECORDS ARE AVAILABLE 
     WHILE @@FETCH_STATUS = 0 
      BEGIN 
       IF(@tno = 0) 
        BEGIN 
         SET @tno = 1; 
         INSERT INTO @AllRecords 
         (department_name, 
          department_code 
         ) 
           SELECT @DepartmentName, 
             @deptt_code; 
         FETCH NEXT FROM cur_FetchDepartmetName INTO @deptt_code, @DepartmentName; 
       END; 
        ELSE 
        BEGIN 
         SET @tno = @tno + 1; 
         INSERT INTO @AllRecords 
         (department_name, 
          department_code 
         ) 
           SELECT @DepartmentName, 
             @deptt_code; 
         FETCH NEXT FROM cur_FetchDepartmetName INTO @deptt_code, @DepartmentName; 
       END; 
      END; 
     --CLOSE CURSOR 
     CLOSE cur_FetchDepartmetName; 
     DEALLOCATE cur_FetchDepartmetName; 

     select department_name, department_code from @AllRecords 
    END;