将值设置为表定义中指定的缺省值

时间:2017-11-09 15:30:45

标签: sql sql-server tsql

假设我有一张桌子(所有名称都是为了说明目的,原始名称已被扣留):

CREATE TABLE [dbo].[tblSomeName](
    [ChangeDate] [DATE] NOT NULL,
    [ID] [INT] NOT NULL,
    [Source] [VARCHAR](100) NOT NULL DEFAULT ('Manual')
)

我想写一个存储过程,如:

CREATE PROC p_PutToTable
(
    @ID [INT], 
    @ChangeDate [date] = NULL,
    @Source [varchar] (100) = NULL
)
AS BEGIN
  MERGE tblSomeName as tgt
  USING (SELECT ... 

如果@Source为NULL,我希望存储过程使用表中的默认值。我想避免在另一个地方硬编码表中指定的默认值,即这个存储过程。也许以某种方式从表定义中查询默认值? (希望有更好的方法)

1 个答案:

答案 0 :(得分:1)

如果您可以创建默认设置,那么它就会变得非常简单。您可以通过更改创建表格的方式来完成。

CREATE TABLE [dbo].[tblSomeName](
    [ChangeDate] [DATE] NOT NULL,
    [ID] [INT] NOT NULL,
    [Source] [VARCHAR](100) NOT NULL
)

alter table tblSomeName
add constraint DF_tblSomeName DEFAULT ('Manual') FOR [Source]

现在我们确切地知道约束的名称是什么,所以我们可以很容易地找到它。

您的程序可能是这样的。

CREATE PROC p_PutToTable
(
    @ID [INT], 
    @ChangeDate [date] = NULL,
    @Source [varchar] (100) = NULL
)
AS BEGIN


    if @Source IS NULL
        select @Source = replace(replace(replace(definition, '(', ''), ')', ''), '''', '')
        from sys.default_constraints
        where name = 'DF_tblSomeName'

    --The rest of your code here

END