2017-01-20 8 views
1
CREATE PROCEDURE [dbo].[sp_HeatMap_Paper] 
    @Grade varchar(150)=NULL, 
    @Site varchar(250)=NULL, 
    @TRef varchar(15)=NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @uregref varchar(50), @regTID varchar(8), 
      @testValue varchar(80), @testResultID int, 
      @lowerL1 varchar(20), @upperL1 varchar(20), 
      @lowerL2 varchar(20), @upperL2 varchar(20) 

    BEGIN TRANSACTION 
    BEGIN TRY 
     DELETE FROM HeatMap; 

    select top 1 @uregref = URegRef from NA_PAPER_HEAT_MAP where RSDESCRIPTION= @Grade and BOX_PLANT1= @Site; 
    select @regTID = RegTID from REGKEY where URegRef = @uregref; 
    select @testValue=TestResult,@testResultID=Result_ID from RESULTDATA where [email protected] and [email protected]; 

    SELECT @lowerL1=Lower, @upperL1=Upper from ResultLimit WHERE Priority = 1 and [email protected]; 
    SELECT @lowerL2=Lower, @upperL2=Upper from ResultLimit WHERE Priority = 2 and [email protected]; 


    Insert into HeatMap (Grade,Site,TestValue,TRef,LowerLimitL1,UpperLimitL1,LowerLimitL2,UpperLimitL2) 
    values (@Grade,@Site,@testValue,@TRef,@lowerL1,@upperL1,@lowerL2,@upperL2) 
    COMMIT TRANSACTION  
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION 
     Return Error_Message() 
    END CATCH 
END 
GO 

をビュー名を渡すために、ここで'NA_PAPER_HEAT_MAP'私は、パラメータ@viewName私はこのストアドプロシージャにビュー名を渡す方法SQL Serverでストアドプロシージャに2014

+2

サイドノート:ストアドプロシージャのプレフィックス 'sp_'を使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です - 接頭辞はまったくありません! –

+2

これは通常、壊れたデータモデルの兆候です。同一の構造を持つ複数のテーブル(またはここではビュー)がある場合は、単一のテーブル(またはビュー)でなければならないことがよくあります。あなたの*データ*の一部が*メタデータ*になっていることを発見すると、特にテーブル名に埋め込まれています。 –

+0

あなたのspの名前は '... HeatMap_Paper'で、 'NA_PAPER_HEAT_MAP'と' HeatMap'を使っています。他のビューやテーブルでは、対応するspを作成してそれらを操作します。 'us_B_Botthead_Beavis'は' NA_BUTTHEAD_STUFF'から選択し、 'BEAVIS_SO_ON'に挿入します。 –

答えて

1
を渡したい代わりにこのような観点であります

動的SQLを構築して実行するには、sys.sp_executesqlを使用して実行します。 使用方法の例をご紹介します。

CREATE PROCEDURE usp_selectView 
    @id INT, 
    @viewName NVARCHAR(1000) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @sql NVARCHAR(MAX), @paramDef NVARCHAR(MAX); 

    -- build dynamic SQL 
    -- you can build whatever SQL you want. This is just an example 
    -- make sure you sanitize @viewName to avoid SQL injection attack 
    SET @sql = 'SELECT * FROM ' + @viewName + ' WHERE Id = @selectedId'; 

    -- dynamic SQL parameter definition 
    SET @paramDef = '@selectedId INT'; 

    -- here, execute the dynamic SQL 
    EXEC sys.sp_executesql @sql, @paramDef, @selectedId = @id 
END 
関連する問題