【问题标题】:T-SQL Stored procedure, declaring variables within the execT-SQL 存储过程,在 exec 中声明变量
【发布时间】:2016-01-13 17:04:31
【问题描述】:

我正在尝试创建一个使用 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')

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

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

【问题讨论】:

  • 我认为你只需要删除括号。
  • exec spInsert 后面的括号?它会按照声明它们的顺序插入我的变量吗?谢谢

标签: sql sql-server tsql stored-procedures


【解决方案1】:

使用具有默认值的参数而不是局部变量:

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

【讨论】:

  • 我认为这看起来像我的解决方案,但是,我想要一些静态变量和一些动态参数 - 这可能吗?在我覆盖它们之前,默认值是否会保持为“Test1”等?感谢您的评论:最佳实践,我会将它们重命名为其他名称。另外,当您说位置参数时,这是否只是按创建顺序写入预设变量?
  • @roastbeeef 玩 LiveDemo。当然,您可以将局部变量添加到存储过程。位置参数顺序很重要。
【解决方案2】:

你快到了。您的代码包含一些错误。我的示例仅演示了使用存储过程可以实现的一小部分。有关更多信息,请参阅 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';

【讨论】:

    【解决方案3】:

    我希望这会有所帮助.. 去掉括号

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

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多