【问题标题】:Default parameter values in SQL Server 2008 stored procedureSQL Server 2008 存储过程中的默认参数值
【发布时间】:2011-11-02 00:40:43
【问题描述】:

我觉得自己像个白痴,但我不能让这个 SP 成为默认值......这是我声明我的参数的方式。

ALTER PROCEDURE [dbo].[PCS_DocumentCacheInsert]
(
    @sessionId varchar(200),
    @mrn varchar(50) ,
    @fromDate datetime,
    @toDate datetime,
    @aggregate varchar(50),
    @author varchar(50),
    @datePerformed dateTime,
    @docId varchar(15),
    @encounterId varchar(15),
    @facility varchar(5),
    @level char(1),
    @orderedByAuthor varchar(50),
    @resultAuthor varchar(50),
    @resultCode varchar(5),
    @resultId varchar(30),
    @resultName varchar(30),
    @status varchar(5),
    @subType varchar(10),
    @type varchar(10),
    @security varchar(3),
    @serviceGroup varchar(15),
    @witmurNum varchar(10),
    @deptId varchar(10),
    @deptText varchar(40),
    @cacheCreateTS dateTime ,
    @cacheStatus varchar(8) ='notReady',
    @cacheUpdateTS datetime
)

除了我无法将notReady 设置为@cacheStatus 的默认值外,此过程一切正常。谷歌说我使用了正确的语法。

这是我在 MS 中的调用方式

EXEC    @return_value = [dbo].[PCS_DocumentCacheInsert]
    @sessionId = N'asdfssa',
    @mrn = N'asdf',
    @fromDate = NULL,
    @toDate = NULL,
    @aggregate = NULL,
    @author = N'author',
    @datePerformed = NULL,
    @docId = N'id',
    @encounterId = NULL,
    @facility = NULL,
    @level = NULL,
    @orderedByAuthor = NULL,
    @resultAuthor = NULL,
    @resultCode = NULL,
    @resultId = NULL,
    @resultName = NULL,
    @status = NULL,
    @subType = NULL,
    @type = NULL,
    @security = NULL,
    @serviceGroup = NULL,
    @witmurNum = NULL,
    @deptId = NULL,
    @deptText = NULL,
    @cacheCreateTS = NULL,
    @cacheStatus = NULL,
    @cacheUpdateTS = NULL

SELECT '返回值' = @return_value

去

所以我添加了这个并且它现在可以工作,但我不明白为什么当我右键单击并说执行存储过程然后选择空复选框为什么它不会默认。我猜检查 null 会将“NULL”发送到 proc 而不是 DBNull?

if @cacheStatus is null
begin
    set @cacheStatus ='notReady'
end

【问题讨论】:

  • 您能否提供一个关于如何调用 SP 的示例?
  • 你的语法看起来不错。检查您传递给@cachStatus 的值。 (即,确保你没有通过一个)。
  • 我从实体框架(来自 WCF 服务)和管理工作室中调用它,相同的行为都没有默认值
  • 忘记IF,只需使用:SET @cacheStatus = ISNULL(@cacheStatus,'notReady')。你可以使用SELECT @cacheStatus = ISNULL(@cacheStatus,'notReady'), @Xyz = ISNULL(@Xyz,'abc'), ... 做多个

标签: sql-server stored-procedures


【解决方案1】:

这样称呼它:

EXEC    @return_value = [dbo].[PCS_DocumentCacheInsert]
    @sessionId = N'asdfssa',
    @mrn = N'asdf',
    @fromDate = NULL,
    @toDate = NULL,
    @aggregate = NULL,
    @author = N'author',
    @datePerformed = NULL,
    @docId = N'id',
    @encounterId = NULL,
    @facility = NULL,
    @level = NULL,
    @orderedByAuthor = NULL,
    @resultAuthor = NULL,
    @resultCode = NULL,
    @resultId = NULL,
    @resultName = NULL,
    @status = NULL,
    @subType = NULL,
    @type = NULL,
    @security = NULL,
    @serviceGroup = NULL,
    @witmurNum = NULL,
    @deptId = NULL,
    @deptText = NULL,
    @cacheCreateTS = NULL,
    --@cacheStatus = NULL,
    @cacheUpdateTS = NULL

如果你想使用默认值,你不能传递@cacheStatus。

【讨论】:

    【解决方案2】:

    您确定您没有发送 null 作为该参数的值吗?仅当您根本不发送该参数时才使用默认值。

    如果您遇到此问题,@JNK 建议使用类似的解决方法:

    IF @Cachestatus IS NULL SET @cachestatus = 'NotReady' 
    

    【讨论】:

    • +1 - 解决方法是添加IF @Cachestatus IS NULL SET @cachestatus = 'NotReady'
    • @JNk 将其作为单独的答案添加,因为如果这确实是他的问题,这可能是应该接受的。
    • @HL - 如果没有您指出通过NULL,我就不会做到这一点,所以没什么大不了的。在你的答案中添加一行。
    【解决方案3】:

    另一个尚未提及的选项是使用关键字“DEFAULT”而不是传递 NULL 值。

    所以当调用 SP 时,代码是:

    EXEC    @return_value = [dbo].[PCS_DocumentCacheInsert]
        @sessionId = N'asdfssa',
        @mrn = N'asdf',
        @fromDate = NULL,
        ...  Just got rid of some lines to focus on the param in question - see DEFAULT below
        @cacheCreateTS = NULL,
        @cacheStatus = DEFAULT,
        @cacheUpdateTS = NULL
    

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2012-08-06
      • 2018-12-06
      • 2018-04-06
      • 1970-01-01
      相关资源
      最近更新 更多