2016-03-09 49 views
0

您好我開發中,我宣佈所謂@TEMP_TABLE的表變量的存儲過程,但此行表變量存儲Procudure

SET @SQL1 = 'UPDATE PO_STAGE set PO_STAGE.ISVALID = ''N'' 
FROM ERP_ADMIN.'[email protected]_TABLE+' PO_STAGE, @TEMP_TABLE TMP 
where PO_STAGE.ERP_PO_ID = TMP.ERP_POID' 
exec (@SQL1) 

我得到「必須聲明表變量‘@TEMP_TABLE’ 「。錯誤。 請在這方面幫助我。下面是存儲過程的代碼。

CREATE PROCEDURE [ERP_ADMIN].[VALIDATE_PURCHASE_ORDER] 

    @STAGE_TABLE nvarchar(50) 
    --   @errorProperty nvarchar(50) output, 
    --  @errorValue nvarchar(120) output 
AS 
BEGIN 

    SET NOCOUNT ON; 
    DECLARE @rule INTEGER 
    DECLARE @approvalcheckingrecord VARCHAR(200) 
    DECLARE @APP_VALIDFROMDATE DATETIME, 
       @APP_VALIDTODATE DATETIME, 
       @numUpdated INTEGER, 
       @numInserted INTEGER, 
       @systodate VARCHAR(160), 
       @SQL1 [nvarchar](1200), 
       @SQL2 [nvarchar](1200), 
       @SOUCOL [nvarchar](200) 


-- SELECT @systodate = CONVERT(VARCHAR(23), ERP_ADMIN.GETCURRENTDATE(), 110) +' '+ CONVERT(VARCHAR(23), ERP_ADMIN.GETCURRENTDATE(), 108) 

--SELECT @systodate = CONVERT(VARCHAR(23), GETDATE(), 110) +' '+ CONVERT(VARCHAR(23), GETDATE(), 108) 

SET @SQL1 = '' 
SET @SQL1 = 'SELECT ERP_SOURCE_COLUMN 
    FROM [ERP_ADMIN].[ERP_STAGE_PROP_MAPPING] where [ERP_SOURCE_TABLE] = '''[email protected]_TABLE+''' and [ERP_REPORT_COLOMNS] = ''Y''' 

-- PRINT @SQL1 

SET @SQL2 = 'DECLARE rpt_cursor CURSOR GLOBAL FOR ' + @SQL1 

exec (@SQL2) 
DECLARE  @SOURCE_COLOMN nvarchar(80) 

SET @SOUCOL = '' 
OPEN rpt_cursor 
    WHILE (0 = 0) 
     --begin of while 
    BEGIN 
     FETCH NEXT FROM rpt_cursor INTO @SOURCE_COLOMN 

     IF (@@FETCH_STATUS = -1) 
     BREAK 

     IF (@SOUCOL = '') 
     SET @SOUCOL = 'convert(nvarchar(255),ISNULL('[email protected]_COLOMN+',''''))+'',''+' 
     ELSE 
     SET @SOUCOL = @SOUCOL + 'convert(nvarchar(255),ISNULL('[email protected]_COLOMN+',''''))+'',''+' 

    END 

    CLOSE rpt_cursor 
    DEALLOCATE rpt_cursor 

    PRINT @SOUCOL 
    DECLARE @TEMP_TABLE TABLE (
       ERP_POID nvarchar(50), 
      ERRORCD nvarchar(50), 
      ERRORMSG nvarchar(120) 
    ) 

    SET @SQL1 = '' 
    SET @SQL1 = 'SELECT ERP_SOURCE_COLUMN 
    FROM [ERP_ADMIN].[ERP_STAGE_PROP_MAPPING] where [ERP_SOURCE_TABLE] = '''[email protected]_TABLE+''' and [ERP_REPORT_COLOMNS] = ''Y''' 

    SET @SQL1 = 'SELECT [ERP_SOURCE_TABLE] 
      ,[ERP_SOURCE_COLUMN] 
      ,[ERP_MANDATORY_CHECK] 
      ,[ERP_DATA_CHECK] 
      ,[ERP_ERROR_PROPERTY1] 
      ,[ERP_ERROR_VALUE1] 
      ,[ERP_ERROR_PROPERTY2] 
      ,[ERP_ERROR_VALUE2] 
    FROM [ERP_ADMIN].[ERP_STAGE_PROP_MAPPING] where [ERP_SOURCE_TABLE] = '''[email protected]_TABLE+''' and ([ERP_MANDATORY_CHECK] IN (''K'',''Y'') or [ERP_DATA_CHECK] IN (''D'',''N''))' 

    PRINT @SQL1 

SET @SQL2 = 'DECLARE stage_cursor CURSOR GLOBAL FOR ' + @SQL1 


    /** DECLARE stage_cursor CURSOR LOCAL FOR 
    /****** Script for SelectTopNRows command from SSMS ******/ 
    SELECT [ERP_SOURCE_TABLE] 
      ,[ERP_SOURCE_COLUMN] 
      ,[ERP_MANDATORY_CHECK] 
      ,[ERP_DATA_CHECK] 
      ,[ERP_ERROR_PROPERTY1] 
      ,[ERP_ERROR_VALUE1] 
      ,[ERP_ERROR_PROPERTY2] 
      ,[ERP_ERROR_VALUE2] 
    FROM [ERP_ADMIN].[ERP_STAGE_PROP_MAPPING] where [ERP_SOURCE_TABLE] = '[email protected]_TABLE+' and ([ERP_MANDATORY_CHECK] IN ('K','Y') or [ERP_DATA_CHECK] IN ('D','N')) **/ 
    exec(@SQL2)  
    DECLARE @CUR_SOURCE_TABLE [nvarchar](120), 
        @CUR_SOURCE_COLUMN [nvarchar](120), 
        @CUR_MANDATORY_CHECK [nvarchar](20), 
        @CUR_DATA_CHECK [nvarchar](20), 
        @CUR_ERROR_PROPERTY1 [nvarchar](50), 
        @CUR_ERROR_VALUE1 [nvarchar](120), 
        @CUR_ERROR_PROPERTY2 [nvarchar](50), 
        @CUR_ERROR_VALUE2 [nvarchar](120) 

    OPEN stage_cursor 
    WHILE (0 = 0) 
     --begin of while 
    BEGIN 
     FETCH NEXT FROM stage_cursor INTO 
      @CUR_SOURCE_TABLE, 
      @CUR_SOURCE_COLUMN, 
      @CUR_MANDATORY_CHECK, 
      @CUR_DATA_CHECK, 
      @CUR_ERROR_PROPERTY1, 
      @CUR_ERROR_VALUE1, 
      @CUR_ERROR_PROPERTY2, 
      @CUR_ERROR_VALUE2 

    IF (@@FETCH_STATUS = -1) 
     BREAK 

     SET @SQL1 = '' 
     SET @SQL2 = ''   
     PRINT @CUR_SOURCE_COLUMN 
     -- IF(@CUR_SOURCE_COLUMN = 'ERP_PO_DOCNUMBER') 
     IF (@CUR_MANDATORY_CHECK = 'Y' OR @CUR_MANDATORY_CHECK = 'K') 
     BEGIN 

     -- SET @SQL1 = 'SELECT ''aaa'' as column1, ERP_PO_DOCNUMBER as column2 
     -- from PURCHASE_ORDER_STAGE where '+ @CUR_SOURCE_COLUMN +' IS NULL' 
     SET @SQL1 = 'SELECT ERP_PO_ID, '''[email protected]_ERROR_PROPERTY1+''' as column1,'[email protected]+'''|1| ERR_01 '''''[email protected]_ERROR_VALUE1+'''+'' or null in input Worksheet'' as column2 
      from [ERP_ADMIN].'[email protected]_TABLE+' where '+ @CUR_SOURCE_COLUMN +' IS NULL' 
     PRINT @SQL1 

     INSERT INTO @TEMP_TABLE 
     exec (@SQL1)        
     END 
     IF (LTRIM(RTRIM(@CUR_DATA_CHECK)) = 'D') 
     BEGIN 

     -- SET @SQL1 = 'SELECT ''aaa'' as column1, ERP_PO_DOCNUMBER as column2 
     -- from PURCHASE_ORDER_STAGE where '+ @CUR_SOURCE_COLUMN +' IS NULL' 
     SET @SQL1 = 'SELECT ERP_PO_ID, '''[email protected]_ERROR_PROPERTY2+''' as column1,'[email protected]+'''|1| ERR_01 '''''[email protected]_ERROR_VALUE2+'''+'' in the input Worksheet'' as column2 
      from [ERP_ADMIN].'[email protected]_TABLE+' where isdate('+ @CUR_SOURCE_COLUMN +') =0' 
     PRINT @SQL1 

     INSERT INTO @TEMP_TABLE 
     exec (@SQL1)        
     END 
     IF (LTRIM(RTRIM(@CUR_DATA_CHECK)) = 'N') 
     BEGIN 
     PRINT @CUR_SOURCE_COLUMN 

     SET @SQL1 = 'SELECT ERP_PO_ID, '''[email protected]_ERROR_PROPERTY2+''' as column1,'[email protected]+'''|1| ERR_01 '''''[email protected]_ERROR_VALUE2+'''+'' in the input Worksheet'' as column2 
      from [ERP_ADMIN].'[email protected]_TABLE+' where isnumeric('+ @CUR_SOURCE_COLUMN +') =0' 

     PRINT @SQL1 
     INSERT INTO @TEMP_TABLE 
     exec (@SQL1)        
     END 

    END 

    CLOSE stage_cursor 
    DEALLOCATE stage_cursor 

    SET @SQL1 = '' 

    SET @SQL1 = 'UPDATE PO_STAGE set PO_STAGE.ISVALID = ''N'' FROM ERP_ADMIN.'[email protected]_TABLE+' PO_STAGE, @TEMP_TABLE TMP where PO_STAGE.ERP_PO_ID = TMP.ERP_POID' 

    PRINT @SQL1 

    exec (@SQL1)  

    /** DECLARE update_stage_cursor CURSOR LOCAL FOR 
    SELECT ERP_POID FROM @TEMP_TABLE 
    DECLARE @CURPOID [nvarchar](50) 

    OPEN update_stage_cursor 
    WHILE (0 = 0) 
     --begin of while 
    BEGIN 
     FETCH NEXT FROM update_stage_cursor INTO 
     @CURPOID 
     IF (@@FETCH_STATUS = -1) 
     BREAK 


    END 

    CLOSE update_stage_cursor 
    DEALLOCATE update_stage_cursor **/ 

    -- SELECT A.ERP_PO_ID FROM ERP_ADMIN.PURCHASE_ORDER_STAGE A, @TEMP_TABLE B where ERP_PO_ID = B.ERP_POID 
    SELECT ERRORCD, ERRORMSG FROM @TEMP_TABLE 
END 
GO 
+5

表變量是隻從當前批處理訪問。改用臨時表。 –

回答

1

您應該通過@TEMP_TABLE作爲參數。要通過參數,你應該先創建表型

IF NOT EXISTS (SELECT 1 FROM sys.types WHERE NAME = 'TEMP_TABLE_TYPE')  
     CREATE TYPE TEMP_TABLE_TYPE AS TABLE(
      ERP_POID nvarchar(50), 
      ERRORCD nvarchar(50), 
      ERRORMSG nvarchar(120) 
    ); 

並使用它:

exec sp_executesql @Sql, N'@TEMP_TABLE TEMP_TABLE_TYPE readonly', @TEMP_TABLE 

對於epxplonation你可以使用這個鏈接Passing table variable into dynamic sql

如果你覺得這種方式不是很明顯,我建議使用臨時表而不是表varible

CREATE TABLE #TEMP_TABLE (
      ERP_POID nvarchar(50), 
      ERRORCD nvarchar(50), 
      ERRORMSG nvarchar(120) 
    ); 
+0

謝謝ВолодинАндрей,在上面的存儲過程中使用臨時表正在工作。再次感謝。 – Mukesh