2017-09-25 8 views
0

卿、 SQLカーソルは一時テーブルに挿入し、Temparory表

は、私は、その一時テーブルから値を取得する一時表&に値を挿入する@AllRecordsとしてカーソルを使用してSQLクエリを構築していからのフェッチします。しかし、テーブルから値を取得しているときにエラーが表示されます(エラー:@AllRecordsの不正な構文です)。以下は私のコードです:

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

は、あなたが '持っています関連する 'END'を持たないBEGIN' – HoneyBadger

+0

これは、カーソルの不要な使用の最良の例です。息を止めて息を呑み、簡単なINSERT..SELECTステートメントとして書き直してください。私はROW_NUMBER()またはIDENTITY()を使用して@tNoを取得すると言いますが、私はポイントがないので、それ以上使用しないでください。 –

答えて

0

の代わりに、この溶液中にエラーが何であるかを答える、私はこの問題へのよりよい解決策を提供したいと思います。この例でのカーソルの使用はまったく必要ありません。問合せを使用せずに問合せを簡単に記述することができます。それは単純なINSERT..SELECTステートメントであり、@tnoを設定するレコードの数を最後で簡単に行うことができます。

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 

カーソルについては、この記事をチェックして、それらを回避する方法してください:

Cursors and How to Avoid Them

+0

Sir、 'project_name varchar(100)'この列は、プロジェクトの詳細があり、対応する部門の下にアップロードされている別のプロジェクトテーブル用です。 –

+0

実際に私は各部門をフェッチしなければならず、またプロジェクトをフェッチする必要があります。プロジェクト表からその部門に対応します –

+0

@SumeetKumar問題が何であれ、カーソルはおそらく必要ありません –

0

以下のようにあなたのSQLクエリ:あなたが最初の変数を設定

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; 
関連する問題