我的问题如下:我使用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”。
如果有人知道如何解决它或我省略了什么步骤,我将不胜感激
答案 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可能也是默认值。