标量SQL函数未返回正确的JSON值

时间:2020-03-23 21:53:50

标签: sql json sql-server

我需要从SQL Server标量函数返回的JSON。

我在SSMS中编写了此查询

SELECT 
    Id AS [Expense.Id],
    Amount AS [Expense.Amount],
    StudentName AS [Expense.StudentName]
FROM 
    [dbo].[Expenses] 
FOR JSON PATH, Root('Expenses')

这是结果(完全是我想要的)

"Expenses": [
    {
      "Expense": {
        "Id": "43838475-5BBC-4C2A-A1E9-85F9E55298D3",
        "Amount": 0.0000000e+000,
        "StudentName": "Carter"
      }
    },
    {
      "Expense": {
        "Id": "38AC0403-5DCF-42E1-A103-5D33DB905F57",
        "Amount": 0.0000000e+000,
        "StudentName": "Louis"
      }
    },
    {
      "Expense": {
        "Id": "5E6EB81E-C988-4D7C-98AB-FA814CFF875A",
        "Amount": 0.0000000e+000,
        "StudentName": "David"
      }
    }

现在,我要做的就是将其包装在一个函数中:

CREATE FUNCTION [dbo].[get_all_json] 
    (@input nvarchar)
RETURNS nvarchar
AS
BEGIN
    DECLARE @return nvarchar

    SET @return = (SELECT 
                       Id AS [Expense.Id],
                       Amount AS [Expense.Amount],
                       StudentName AS [Expense.StudentName]
                   FROM 
                       [dbo].[Expenses] 
                   FOR JSON PATH, Root('Expenses'))
    RETURN @return
END

现在我在SSMS中称它为

SELECT TRIM( dbo.get_all_json('1')) json_fm_func;

然后我得到这个结果:

enter image description here

SELECT TRIM( dbo.get_all_json('1')) json_fm_func;

出了什么问题?

1 个答案:

答案 0 :(得分:1)

您需要将nvarchar更改为nvarchar(max)

create function [dbo].[get_all_json] (@input nvarchar(max)) 
--the argument (@input) is never used. you can create your function without argument. 
returns nvarchar(max) as
begin
    declare @return nvarchar(max)
    set  @return =  (SELECT Id as [Expense.Id]
      ,Amount As [Expense.Amount]
      ,StudentName As [Expense.StudentName]
          FROM [dbo].[Expenses] FOR JSON PATH, Root('Expenses'))
    return @return
end