使用openjson创建存储过程时出错

时间:2020-05-27 18:17:57

标签: sql sql-server stored-procedures

我的问题如下:我使用SQL Server 2017 Express,我以前格式化过一个类型为json的变量,它在常规查询中可以正常运行。

但是当我创建存储过程时,出现错误并且我真的不知道如何解决它。如果有人能帮助我摆脱困境,我将不胜感激。

这是普通查询中的代码

DECLARE @json NVARCHAR(MAX)
SET @json =   
  '
  {
    "varios":[{
    "name":"David",
    "cant":"291123",
     "number":"205893"
        },
        {
    "name":"pedro",
    "cant":"295523",
     "number":"206693"
        },
            {
    "name":"maria",
    "cant":"295523",
     "number":"206693"
        }
    ]
    }
' 
SELECT * 
FROM OPENJSON (@json, '$.varios' )  
     WITH (   
              name varchar(200) '$.name' ,  
              cant    int     '$.cant',  
              number int '$.number' 
          ) ;

这将返回以下结果:

Name         cant       number
------------------------------
David       291123      205893
pedro       295523      206693
maria       295523      206693

但是当我尝试在这样的存储过程中做同样的事情时:

CREATE PROCEDURE sp_pro
    @json NVARCHAR(max)
AS
BEGIN
    SET @json =   
  '
  {
    "varios":[{
    "name":"David",
    "cant":"291123",
     "number":"205893"
        },
        {
    "name":"pedro",
    "cant":"295523",
     "number":"206693"
        },
            {
    "name":"maria",
    "cant":"295523",
     "number":"206693"
        }
    ]
    }
' 
    SELECT * 
    FROM OPENJSON(@json, '$.varios' )  
    WITH (
            nombre varchar(50) '$.name',  
            cantidad int '$.cant',  
            numero int '$.number' 
         );
END

我收到以下无法解决的错误:

消息102,级别15,状态1,过程sp_prueba2,第29行[批处理开始第0行]
Sintaxis不正确,为“ $ .name”。

如果有人知道如何解决它或我省略了什么步骤,我将不胜感激

1 个答案:

答案 0 :(得分:0)

OPENJSON函数仅在兼容级别130或更高版本下可用。如果您的数据库兼容性级别低于130,则SQL Server无法找到并运行OPENJSON函数。其他JSON函数在所有兼容性级别上都可用。

您可以在sys.databases视图或数据库属性中检查兼容性级别。您可以使用以下命令更改数据库的兼容性级别:

private void NightsLabel_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
        e.Handled = true;
    }
    if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
    {
        e.Handled = true;
    }

}

private void TotalButton_Click(object sender, EventArgs e)
{
    RoomChargeLabel.Text = (Convert.ToInt64(NightRateLabel.Text) + Convert.ToInt64(NightsLabel.Text)).ToString();
}

即使在新的Azure SQL数据库中,兼容性级别120可能也是默认值。

相关问题