如何保留行中所有数据的 JSON 版本的计算列?

How can I keep a computed column of a JSON version of all the data in the row?

我们需要 return JSON 基于大量嵌套的 table。我认为如果节点 tables 已经在计算列中准备了 JSON,这会更快。 是否可以在计算列中使用 JSON_QUERY 或将函数写入 return 行中的所有列作为 JSON?当我尝试将它放入 table 设计器的新计算列时,它被拒绝了。我可以想象一个函数必须查找自己的数据而不是直接从列中获取值,但这似乎效率低下。 我欢迎建议或替代方法。

是的,您可以在计算列定义中使用 JSON_QUERY。不过,您的部分问题是询问计算列返回其他列值的 JSON 表示形式,这需要更多工作。

例如,如果您尝试创建以下 table 定义:

create table dbo.Foo (
  FooID int,
  Bar nvarchar(50),
  Baz date,
  ComputedJSON as (select FooID, Bar, Baz for json path)
);

您将收到以下错误消息:

Msg 1046 Level 15 State 1 Line 5
Subqueries are not allowed in this context. Only scalar expressions are allowed.

要解决此问题,您需要将子查询移至用户定义的函数,例如:

create function dbo.FooJson(@FooID int)
returns nvarchar(max)
as
begin
  return cast((
    select FooID, Bar, Baz
    from dbo.Foo
    where FooID=@FooID
    for json path
  ) as nvarchar(max));
end
go
create table dbo.Foo (
  FooID int,
  Bar nvarchar(50),
  Baz date,
  ComputedJSON as dbo.FooJson(FooID)
);
go

现在当你执行以下命令时:

insert dbo.Foo (FooID, Bar, Baz) values (1, N'Hello', '21-Jan-2021');
select * from dbo.Foo;

您将看到结果:

FooID Bar Baz ComputedJSON
1 Hello 2021-01-21 [{"FooID":1,"Bar":"Hello","Baz":"2021-01-21"}]