1

このエラーが発生します:スカラー変数「@TempTable1」を宣言する必要があります。@ Temptable1の前後から一重引用符を削除しても、行が返されない場合、クエリは機能します。

    ALTER PROCEDURE dbo.StoredProcedure2
      @Studentcode int
    AS
      DECLARE @sql AS nvarchar(max)
      DECLARE @pivot_list AS nvarchar(max) -- Leave NULL for COALESCE technique
      DECLARE @select_list AS nvarchar(max) -- Leave NULL for COALESCE technique
      Declare @TempTable1 AS table(CourseTitel nvarchar(50) , Grade nvarchar(50))

      INSERT INTO @TempTable1 (CourseTitel, Grade) 
       SELECT Courses.CourseTitel, Status.Status 
       FROM Status 
         INNER JOIN Courses ON Status.CourseCode = Courses.CourseCode 
       WHERE (Status.StudentCode = @Studentcode)

      SELECT @pivot_list = COALESCE(@pivot_list + ', ','') + '[' + CONVERT(varchar, PIVOT_CODE) + ']',
             @select_list = COALESCE(@select_list + ', ','') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']'
      FROM (SELECT DISTINCT PIVOT_CODE 
            FROM (SELECT CourseTitel, Grade, ROW_NUMBER() OVER (PARTITION BY CourseTitel ORDER BY Grade) AS PIVOT_CODE 
                  FROM @TempTable1) 
            AS rows) 
      AS  PIVOT_CODES

    SET @sql = ';WITH p AS (SELECT CourseTitel, Grade, 
                ROW_NUMBER() OVER (PARTITION BY urseTitel ORDER BY Grade) AS PIVOT_CODE 
                FROM ' + @TempTable1 + ' ) SELECT CourseTitel, ' + select_list + '
                FROM p PIVOT (MIN(Grade)FOR PIVOT_CODE IN (' + @pivot_list + ')) AS pvt'
    --PRINT (@sql)
    EXEC (@sql)
    /* SET NOCOUNT ON */    
4

1 に答える 1

1

したがって、テーブル変数を宣言し、それに対して動的SQLを実行しようとしています。問題は、動的SQLが実行されるexecか、sp_executeSql基本的に独自のスコープで実行されるため、テーブル変数がそこで宣言されず、その後クエリで使用できないことです。

2つの回避策を提案できます。

  • テーブルを一時テーブルとして使用できるようにします。一時テーブルは実際のテーブルであるため、どのスコープでもアクセスでき、動的SQLでアクセスできます。いくつかの疑似tsqlは次のようになります。

    ...
    if object_id('tempdb..#TempTable1 ') is not null
      drop table #TempTable1 
    
    create table #TempTable1 (CourseTitel nvarchar(50) , Grade nvarchar(50))
    ...
    @sql = '... AS PIVOT_CODE FROM #TempTable1) SELECT CourseTitel...'
    
  • テーブル変数を、パラメータ値のテーブルとして動的SQLブロックに渡します。これは、SQLServer2008以降でのみ機能します。ただし、これには、テーブルの構造をSQLサーバータイプとして定義する必要があります。これは、次のように、システムレベルで1回実行できます。

    CREATE TYPE TempTableType AS TABLE (CourseTitel nvarchar(50) , Grade nvarchar(50))
    

    次に、その型を使用してテーブル変数を宣言し、パラメーターのように動的SQLに渡すことができます。

    ...
    declare @TempTable1 AS TempTableType 
    ...
    @sql = N'... AS PIVOT_CODE FROM @TempTable1) SELECT CourseTitel...'
    EXEC sp_executesql @SQL, 
                       N'@TempTable1 TempTableType READONLY', 
                       @TempTable1 =@TempTable1 
    
于 2012-12-22T21:26:23.397 に答える