【问题标题】:Syntax for Default Value for User Defined Type as Table用户定义类型为表的默认值的语法
【发布时间】:2014-10-15 19:33:31
【问题描述】:

假设您有一个用户定义类型,如下所示:

CREATE TYPE [dbo].[MyDefineType] As Table                
(
ID int NOT NULL
, Column1 int NOT NULL   
, Column2 Nvarchar(128)  NULL
, Column3 Nvarchar(128) NULL
, Column4 Nvarchar(128) NULL 
, Column5 Nvarchar(128) NULL       
)

因此,当我通过存储过程传递一个有值表时,该类型反映了该表的架构。

我的问题是给其中一列一个默认值的语法是什么?例如,如果我通过循环中的存储过程传递这些值,我可以给第 5 列一个默认值,所以如果我只传递前 4 列的值,如果没有,5 将默认为我定义的值值被传递。用户定义的类型可以吗?

【问题讨论】:

  • 与常规表的内联默认约束相同的语法。 [name] [data type] DEFAULT N'value'

标签: sql sql-server-2008 tsql


【解决方案1】:

使用普通语法(参见CREATE TYPE,MSDN):

(正如我回答的 cmets 中所述,正确的正常语法是使用命名约束,但表类型不能使用命名约束,必须使用“速记”语法)。

CREATE TYPE [dbo].[MyDefineType] As Table                
(
  ID int NOT NULL DEFAULT 0
, Column1 int NOT NULL DEFAULT 99
, Column2 Nvarchar(128) NULL DEFAULT N'DefaultValue'
, Column3 Nvarchar(128) NULL
, Column4 Nvarchar(128) NULL 
, Column5 Nvarchar(128) NULL       
)

例如,使用上面的定义,前三列有默认值:

DECLARE @t MyDefineType
INSERT @t VALUES (1, DEFAULT, DEFAULT, N'c', N'd', N'e')
SELECT * FROM @t

ID  Column1 Column2         Column3 Column4 Column5
1   99      DefaultValue    c       d       e

【讨论】:

  • +1 但是,公平地说,这是表类型和表变量所需的简写,而不是常规表的正常语法。常规表的最佳实践应该是使用显式 CONSTRAINT ... DEFAULT ... FOR 语法命名约束。
  • @AaronBertrand 是的,这是真的;也许我有点太快了。
  • 虽然最佳实践不适用于表类型,因为它们不能具有命名约束。
  • @MartinSmith 是的,对不起,我的意思是暗示这是表类型所必需的,但不是普通表的“正常”。
  • 我在答案中加入了你的 cmets。谢谢:)
猜你喜欢
  • 2021-03-04
  • 2010-12-27
  • 2021-12-24
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2022-01-17
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多