假设我有一张桌子(所有名称都是为了说明目的,原始名称已被扣留):
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,我希望存储过程使用表中的默认值。我想避免在另一个地方硬编码表中指定的默认值,即这个存储过程。也许以某种方式从表定义中查询默认值? (希望有更好的方法)
答案 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