【问题标题】:Create View and For Json clause创建 View 和 For Json 子句
【发布时间】:2016-06-06 13:51:41
【问题描述】:

使用SQL Server 2016,我可以运行这个简单的查询:

SELECT  colA, colB, json_query(infoJson) AS Expr1
FROM    dbo.Table_1 
FOR     json auto

我什至可以将它包装在一个存储过程中。而且运行良好。

但是当我试图从该陈述中创建一个视图时,有些奇怪(至少对我而言):

CREATE VIEW [dbo].[View_1]
AS
SELECT   colA, colB, json_query(infoJson) AS Expr1
FROM     dbo.Table_1 
FOR      json auto

这是我得到的错误:

消息 4511,级别 16,状态 1,过程 View_1,第 5 行 [批处理开始第 9 行] 创建视图或函数失败,因为没有为第 1 列指定列名。

但只要我评论--for json autoVIEW 就会按预期创建。

为什么?我真的很希望在我的 sql 视图中有 FOR JSON

【问题讨论】:

  • 您的视图希望您为 json 列命名。
  • 不是这样的。关键是我无法将“for json”应用到视图中。
  • 错误具有误导性
  • 当我说“...按预期创建”时,我需要纠正自己 视图刚刚创建但未按预期创建,因为 FOR JSON 会有所作为

标签: sql json sql-server-2016


【解决方案1】:

FOR XML | JSON AUTO 返回单个列(字符 LOB)。因此,您需要修改 SELECT 语句以在视图中返回单个列,例如:

CREATE VIEW [dbo].[View_1]
AS
SELECT (
SELECT   colA, colB, json_query(infoJson) AS Expr1
FROM     dbo.Table_1 
FOR      json auto
) as X

【讨论】:

  • 这是解决 SSMS 包装 SQL For JSON 查询结果的问题的绝妙技术 - 这需要更广泛地了解。 - 顶级作品
【解决方案2】:

您可以在创建视图语句中添加列:

CREATE VIEW [dbo].[View_1]
(column_name)
AS
    SELECT colA, colB, json_query(infoJson) AS Expr1
      FROM dbo.Table_1 
       FOR json auto

【讨论】:

  • 哇,我成为 DBA/Dev 已经有一段时间了,不知道您可以将列添加到这样的视图中。非常好。为什么这不是答案??
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2013-08-13
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多