2014-09-24 31 views
0

我有一個存儲過程,但是當我從我的前端執行它,我得到這個錯誤:SQL Server存儲過程錯誤。無效標識符

The name 'CREATE TABLE tmp_148_58 (affili_item_id varchar(250),academic_id varchar(250),college_id varchar(250),item_value_quantity_college_entry varchar(250),item_value_notes_college_entry varchar(250),college_enter_on varchar(250),college_enter_by varchar(250),affili_category_colleges_autoid varchar(20))' is not a valid identifier.

我的程序代碼:

ALTER PROCEDURE [dbo].[SpPortal_AppForAffi_Upd_Both_Lbl_And_Vals1] 
    (@columnList TEXT 
    ,@insScript nvarchar(1000) 
    ,@collegeId INT 
    ,@LoginId BIGINT) 
AS 
BEGIN 
    DECLARE 
     @tmpTableName VARCHAR(200), 
     @effectCount INT = 0, 
     @effectCountTotal INT = 0, 
     @ExeQuery nvarchar(1000), 
     @InsertQuery nvarchar(1000) 

    SET @tmpTableName = CONCAT('#tmp_',@collegeId,'_',@LoginId); 

    SET @ExeQuery = CONCAT('DROP TABLE IF EXISTS ', @tmpTableName);    

    EXECUTE @ExeQuery ; 

    -- create temp table.. -- 
    SET @ExeQuery = CONCAT ('CREATE TABLE ' , @tmpTableName , ' (',@columnList,')') ;  -- here column list should be come from froent end... 
    EXECUTE @ExeQuery; 

    -- # create temp table.. -- 
    -- load data into temp table -- 
    SET @InsertQuery = CONCAT(' ' , @insScript); 

    EXECUTE @InsertQuery; 

    -- # load data into temp table.. -- 
    -- updating affili_items_colleges master table-- 
    SET @effectCount=0; 
    -- SET param_sp_success=0; 
    Begin TRANSACTION 
     Begin Try 
     -- SET param_sp_success = 0; 
     SET @effectCount = 0; 
     SET @effectCountTotal = 0; 

     SET @ExeQuery = CONCAT(' UPDATE ', @tmpTableName,' AS tmp ,affili_item_label afil,affili_items afi 
     SET afil.item_lable_name = tmp.item_value_quantity_college_entry 
    ,afil.enter_on=tmp.college_enter_on 
    ,afil.enter_by= tmp.college_enter_by 
    WHERE tmp.affili_item_id=afil.affili_item_id AND tmp.affili_item_label_id = afil.affili_item_label_id 
    AND afi.is_label = 1 AND tmp.academic_id=afil.academic_id AND tmp.college_id=afil.college_id 
    AND tmp.affili_item_id = afi.affili_item_id AND afi.active_status = 1 ');  

    EXECUTE @ExeQuery; 

    SET @ExeQuery = CONCAT(' UPDATE ', @tmpTableName,' AS tmp ,affili_items_colleges afic,affili_items afi 
    SET afic.item_value_quantity_college_entry = tmp.item_value_quantity_college_entry 
    ,afic.item_value_notes_college_entry=tmp.item_value_notes_college_entry 
    ,afic.college_enter_on=tmp.college_enter_on 
    ,afic.college_enter_by= tmp.college_enter_by 
    WHERE tmp.affili_item_id=afic.affili_item_id AND tmp.affili_item_label_id = afic.affili_item_label_id 
    AND tmp.academic_id=afic.academic_id AND tmp.college_id=afic.college_id 
    AND tmp.affili_item_id = afi.affili_item_id AND afi.is_label <> 1 AND afi.active_status = 1 ');  

    EXECUTE @ExeQuery;  

    declare @te int=0 

    SET @ExeQuery = CONCAT ('SELECT COUNT(tem.affili_item_id) INTO @te 
    FROM ',@tmpTableName,' tem INNER JOIN affili_items afi ON tem.affili_item_id = afi.affili_item_id AND afi.is_label <> 1 
    WHERE afi.active_status = 1 ') ; 

    EXECUTE @ExeQuery; 

    SET @effectCount=0; 
    SET @effectCount = @te ; 

     IF(@effectCount>0) 
     BEGIN 

     SET @effectCountTotal= @effectCount+1; 

     END 

    -- SET param_sp_success = effectCountTotal; 
IF(@@TRANCOUNT>0) 
     BEGIN 
      COMMIT TRANSACTION 
     END 
    ELSE 
     BEGIN 
      ROLLBACK TRANSACTION 
     END 
    END TRY 

    BEGIN CATCH 
     ROLLBACK TRANSACTION 
    END CATCH 

END 

誰能幫我解決它?我將上面的查詢從mysql轉換爲SQL Server。

+0

此外,你爲什麼要創建這樣的臨時表? – DavidG 2014-09-24 10:48:43

+0

您的代碼中根本沒有創建/引用表「tmp_148_58」。錯誤正在從其他地方拋出。請找到相關的代碼部分併發布。 – CodeNewbie 2014-09-24 10:54:41

回答

1

首先 - 我真的不知道爲什麼你使用這一切動態創建的報表。正如我從腳本中看到的 - 唯一的原因是您創建臨時表的唯一名稱。

但是,您並不需要臨時表具有唯一的名稱,因爲此表僅在存儲過程的創建範圍內可見(並且也位於從該存儲過程調用的「子」過程的範圍內)。

此外,根據您的錯誤,它看起來像您的腳本試圖創建真實的,而不是臨時表 - 請參閱CREATE TABLE tmp_148_58 - 表的名稱不包含#。因此,您可能無權在運行sp的帳戶下創建真實的表格。

我建議你重寫你的代碼沒有這種混亂的動態和錯誤應該消失;)

+0

我用我的形式,在我的程序動態控件我串連這樣得到臨時表名SET @tmpTableName = CONCAT(「#TMP _」,@ collegeId,「_」,@登錄ID); – Skumar 2014-09-24 11:04:50

+1

@Skumar,再次 - 沒有真正的需要您的臨時表名稱是唯一的,因此動態創建 – 2014-09-24 11:05:58