【问题标题】:SQL Server stored procedure: setting default value for input parameter though query executionSQL Server 存储过程:通过查询执行设置输入参数的默认值
【发布时间】:2016-12-10 00:17:45
【问题描述】:

假设我有以下存储过程:

CREATE PROCEDURE test
   @my_var varbinary
AS
   SELECT @my_var as my_var

但是我想修改它,使@my_var 具有默认值。我不知道该值的字面意思是什么,但我知道在数据库中的何处获取它。

类似:

declare @var int
SELECT @var = my_variable from my_table where something = 'what I need'
GO

CREATE PROCEDURE test
    @my_var varbinary = @var
AS
    SELECT @my_var as my_var

但是,这失败了。似乎@var 超出了范围。

有可能做那种事吗?

谢谢!

【问题讨论】:

  • 这个值会改变,还是在存储过程的整个生命周期中都一样?
  • 它可能,但是,我只想执行一次查询,获取该值并将其作为默认值放入 SP。换句话说,从现在到时间结束,查询可能不一定返回相同的值,但我只关心我在创建 SP 时通过此查询获取的值。因此,不幸的是,将默认值设置为 NULL 并在 SP 内进行 if 检查并从那里调用查询是不可行的。
  • 您选择 inside proc,紧跟在AS 之后并设置@my_var 的值

标签: sql-server stored-procedures default-value


【解决方案1】:

在运行时使用值:

CREATE PROCEDURE test
  @my_var varbinary = NULL
AS
BEGIN
IF   @my_var IS NULL
    SELECT @my_var = my_variable from my_table where something = 'what I need'

  SELECT @my_var as my_var
END

要在创建时使用一个值,构建一个CREATE PROC 字符串并执行它

declare @var int
declare @SQL VARCHAR(4000)

SELECT @var = id from sysobjects where id =3



SET @SQL = 'CREATE PROCEDURE test @my_var varbinary = ' + CAST(@var AS VARCHAR(20)) + '
AS
    SELECT @my_var as my_var'

EXEC(@SQL)

正如我所提到的......如果你只创建一次,为什么还要让它变得复杂呢?如果您多次创建它,那么您应该在运行时进行。如果您要部署到许多数据库,则可能需要执行此操作,但在这种情况下,您可能需要考虑将其包装在数据库项目中

【讨论】:

  • 第一个选择查询是在创建存储过程时只执行一次,还是在每次调用时都执行?谢谢!
  • 每次。您是担心价值会发生变化还是担心性能?
  • 我不担心性能。我担心价值可能会有所不同。有没有办法只运行一次并将该值硬编码到 SP 中?
  • 是的,您需要使用动态 SQL。您构建一个大字符串,将您的值连接到字符串中并使用EXEC 运行它。但是如果你只创建一次这个 SP……那有什么意义呢?相反,如果您多次创建它,那么您也可以在运行时在 SP 中选择它。这里有些东西没有意义。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多