簡體   English   中英

T-SQL存儲過程,在exec中聲明變量

[英]T-SQL Stored procedure, declaring variables within the exec

我正在嘗試使用T-SQL創建存儲過程以將變量插入表中。 使用我所知道的方法,您可以在存儲過程的創建中聲明變量,但是我相信可以將變量聲明為exec語句的一部分,以使插入動態化。 我已經在Google,Google和Google上搜索了,找不到任何支持此功能的信息。

這是我的示例代碼,它帶有靜態變量:

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')

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

這有意義嗎? 有任何想法嗎?

使用具有默認值的參數代替局部變量:

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

希望對您有所幫助。

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

你快到了。 您的代碼包含一些錯誤。 我的示例僅說明了使用存儲過程可以實現的部分功能。 有關更多信息,請參閱Microsoft的MSDN 幫助文檔

該示例使用臨時過程(名稱前面的哈希使其變為臨時)。 但是這些原則適用於常規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';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM