T-SQL存储过程,在exec

时间:2016-01-13 17:04:31

标签: sql sql-server tsql stored-procedures

我尝试使用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')

而不是在过程中创建静态变量。允许用户执行存储过程而不修改其内容。

这有意义吗? 有什么想法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我希望这会有所帮助.. 删除括号

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

答案 2 :(得分: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关键字之后。这转变   关闭SQL Server在任何后发送回客户端的消息   执行SELECT,INSERT,UPDATE,MERGE和DELETE语句。   数据库和应用程序的整体性能得到改善   消除这种不必要的网络开销。

在示例中,我给每个参数一个默认值,但这是可选的。下面显示了如何使用变量和硬编码值调用此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';