2016-01-13 69 views
1

我試圖創建一個使用T-SQL將變量插入到表中的存儲過程。使用我所知道的方法,在創建存儲過程時聲明變量,但我相信可以將變量聲明爲exec語句的一部分,以使插入動態化。我搜索了谷歌搜索和谷歌搜索,並找不到任何支持這一點。T-SQL存儲過程,在exec中聲明變量

這裏是我的示例代碼,因爲它代表與靜態變量:

create procedure spInsert as 
    declare @insertValueOne varchar(5) = 'Test1' 
    declare @insertValueTwo varchar(5) = 'Test2' 
    declare @insertValueThree varchar(5) = 'Test3' 
    declare @insertValueFour varchar(5) = 'Test4' 

begin 

insert into testTable 
(ValueOne, ValueTwo, ValueThree, ValueFour) 
values 
(@insertValueOne, @insertValueTwo, @insertValueThree, @insertValueFour) 

end 

exec spInsert 

我試圖做到的,是一個情況我可以可以使用腳本執行這樣的例子:

exec spInsert('Test1', 'Test2', 'Test3', 'Test4') 

而不是在過程中創建靜態變量。允許用戶執行存儲過程而不修改其內容。

這是否有意義? 有什麼建議嗎?

+0

我想你只需要刪除括號。 –

+0

exec spInsert後的圓括號?它會插入我的變量在它們被聲明的順序中嗎? thx – roastbeeef

回答

1

使用aguments使用默認值,而不是局部變量:

create procedure dbo.spInsert 
    @insertValueOne varchar(5) = 'Test1' 
    ,@insertValueTwo varchar(5) = 'Test2' 
    ,@insertValueThree varchar(5) = 'Test3' 
    ,@insertValueFour varchar(5) = 'Test4' 
AS 
BEGIN 
    -- You can still use local variables 
    -- DECLARE @my_local_variable = UPPER(@insertValueOne); 

    INSERT INTO testTable(ValueOne, ValueTwo, ValueThree, ValueFour) 
    VALUES (@insertValueOne, @insertValueTwo, @insertValueThree, @insertValueFour) 
END; 

電話:

-- named parameters (good practice, self-documenting) 
EXEC spInsert @insertValueOne = 'Test1', @insertValueTwo = 'BBB'; 
-- positional parameters(order is crucial) 
EXEC spInsert 'Test1', 'Test2', 'Test3', 'Test4' 

LiveDemo

命名用戶定義的存儲與sp過程不是最好的做法。


我想,這看起來像我的解決方案

不,它不是你的存儲過程不接受任何參數。

create procedure spInsert as 
    declare @insertValueOne varchar(5) = 'Test1' 
    declare @insertValueTwo varchar(5) = 'Test2' 
    declare @insertValueThree varchar(5) = 'Test3' 
    declare @insertValueFour varchar(5) = 'Test4' 

begin 

insert into testTable 
(ValueOne, ValueTwo, ValueThree, ValueFour) 
values 
(@insertValueOne, @insertValueTwo, @insertValueThree, @insertValueFour) 

end 
+0

我認爲這看起來像我的解決方案,但是,我想要一些變量static和一些動態參數 - 這可能嗎?默認值會保留爲'Test1'等,直到我覆蓋它們?感謝評論re:best practice,我會將它們重命名爲其他內容。另外,當你說位置參數時,這只是以創建它們的順序寫預設變量? – roastbeeef

+0

@roastbeeef玩LiveDemo。當然,你可以添加本地變量到你的存儲過程。具有位置參數的順序非常重要。 – lad2025

0

我希望這有助於.. 刪除括號

exec spInsert 'Test1', 'Test2', 'Test3', 'Test4' 
0

就快成功了。您的代碼包含一些錯誤。我的例子只演示了存儲過程可以實現的一小部分。有關更多信息,請參閱Microsoft的MSDN help docs on procedures

該示例使用臨時過程(名稱前面的散列使其成爲臨時)。但是這些原則適用於常規SP。

SP

/* Declares a temp SP for testing. 
* The SP has two parameters, each with a default value. 
*/ 
CREATE PROCEDURE #TempExample 
    (
     @ValueOne VARCHAR(50) = 'Default Value One', 
     @ValueTwo VARCHAR(50) = 'Default Value Two' 
    ) 
AS 
SET NOCOUNT ON; 
BEGIN 

    SELECT 
     @ValueOne AS ReturnedValueOne, 
     @ValueTwo AS ReturnedValueTwo  
END 
GO 

我已經包括了SET NOCOUNT ON聲明。 MSDN在最佳實踐部分推薦了這一點。

使用SET NOCOUNT ON語句作爲 過程體中的第一條語句。也就是說,把它放在AS關鍵字的後面。這會在執行任何 SELECT,INSERT,UPDATE,MERGE和DELETE語句後關閉SQL Server發送回客戶端的消息 。 數據庫和應用程序的整體性能得到提高,由 消除了這種不必要的網絡開銷。

在這個例子中,我給每個參數一個默認值,但這是可選的。下面顯示瞭如何使用變量和硬編碼值調用此SP。

如通話

/* We can declare varaiabels outside the SP 
* to pass in values. 
*/ 
DECLARE @ParamOne VARCHAR(50) = 'Passed Value One'; 

/* Calling the SP with params. 
* You can use variables or hard coded values. 
*/ 
EXECUTE #TempExample @ParamOne, 'Passed Value Two';