2012-12-22 32 views
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 */  

回答

1

因此,您正在聲明一個表變量,並試圖對其運行動態SQL。問題在於,使用execsp_executeSql完成的動態SQL基本上在其自己的作用域中運行,因此表變量未在那裏聲明,並且隨後不能在查詢中使用。

我可以提出兩種解決方法:

  • 使可作爲臨時表的表。因爲臨時表是真實的表,所以它們可以在任何範圍內訪問,所以它們可以在動態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塊作爲有價值parameted的表。這隻會在sql server 2008及更高版本中起作用。然而,這要求將表的結構定義爲sql服務器類型。這是可以做到一次,在一個系統級,如:

    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 [email protected] 
    
相關問題