2017-01-20 45 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

這通常是數據模型中斷的標誌 - 如果您有多個具有相同結構的表(或此處的視圖),則通常情況下它們應該是單個表(或視圖)。通常伴隨着發現你的一些* data *已經變成* metadata *,特別是它被嵌入到表名中。 –

+0

你的sp被命名爲'... HeatMap_Paper'並且正在使用'NA_PAPER_HEAT_MAP'和'HeatMap'。對於任何其他視圖和表格,創建對應的sp以與它們一起工作,例如, 'usp_Butthead_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 
相關問題