如何保留行中所有数据的 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"}]
我们需要 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"}] |