【问题标题】:Can a computed field be set to anything other that VARCHAR(MAX)?计算字段可以设置为除 VARCHAR(MAX) 以外的任何值吗?
【发布时间】:2022-01-23 17:28:38
【问题描述】:

我有一个带有字段District 的表,即VARCHAR(5)

当我创建一个计算域时:

ALTER TABLE
  Postcode
ADD
 DistrictSort1
AS
  (dbo.fn_StripCharacters(District, '^A-Z'))
PERSISTED;

计算域DistrictSort1添加为NVARCHAR(MAX)

是否可以将NVARCHAR 更改为(MAX) 以外的任何内容?

是否存在性能问题?

【问题讨论】:

  • 那么fn_StripCharacters的返回类型是nvarchar(max)?您可以更改 UDF 的返回类型,还是将其转换为其他类型?
  • "计算字段 DistrictSort1 被添加为 NVARCHAR(MAX)" 这意味着您的函数 fn_StripCharacters 被定义为返回它。问题不在于列,而在于功能。也许您应该拥有多个返回不同数据类型的dbo.fn_StripCharacters 版本。

标签: sql sql-server


【解决方案1】:

显而易见的答案是 CAST/CONVERT 在计算列中明确显示值:

ALTER TABLE dbo.Postcode
ADD DistrictSort1 AS CONVERT(varchar(5),(dbo.fn_StripCharacters(District, '^A-Z')) PERSISTED;

不过,我建议查看您的函数fn_StripCharacters,该函数当前设置为返回nvarchar(MAX)。与 SQL Server 中内置的函数不同,用户定义的函数不能根据其输入参数返回不同的数据类型。因此,每当您引用您的函数时,您都会得到一个 nvarchar(MAX) 回复。

因此,有时最好有多个相同功能的相似版本。对于这样的例子,您可能需要 4,它返回非 MAXMAX 长度的 varcharnvarchar 值。

【讨论】:

  • 好答案。我正在使用一个返回NVARCHAR(MAX) 的通用函数。我查看了 SSMS 以更改计算字段类型,但没有什么明显的允许这样做的。使用CAST 可能是我暂时会采用的方式,但具有不同输出类型的多个函数可能是更好的长期解决方案。
  • 你不能 ALTER 计算列 @Coilover ;你必须 DROP 和 reCREATE 它。
  • 是的,发现了。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2011-03-17
  • 2023-03-07
  • 2011-10-24
  • 2011-04-05
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多