首页 > 解决方案 > 如何将json值传递给节点js中的存储过程

问题描述

我有一个存储过程,它在 Microsoft SQL Server 中包含一个“用户定义的表类型”参数。我将“数据表”作为参数值传递给 C# 中的存储过程。我想知道如何将节点 js 中的 Json 数据作为“数据表”传递给这个存储过程。

用户定义的表类型:

CREATE TYPE [dbo].[TpUserRights] AS TABLE
                                    (
                                        [ConfigId] [int] NULL,
                                        [FormId] [int] NOT NULL
                                    )

存储过程:

CREATE PROCEDURE [dbo].[SpMergeUserRights] 
    (@UserRights TpUserRights ReadOnly) 
AS
BEGIN
    MERGE ModuleUserConfig AS [Target]
    USING @UserRights AS [Source] ON [Target].ConfigId = [Source].ConfigId

    WHEN NOT MATCHE BY TARGET
       THEN
           INSERT (ModuleId, FormId, UserId, CreatedBy) 
           VALUES (@ModuleId, [Source].FormId, @UserId, @CreatedBy) 

    WHEN MATCHED
       THEN 
           UPDATE 
           SET FormId = [Source].FormId,
               UserId = @UserId, 
               ModifiedDate = GETDATE(),
               ModifiedBy = @CreatedBy;
END

标签: c#node.jssql-server-2008

解决方案


这在 SQL Server 2016 及更高版本中很简单。只需将 JSON 作为字符串传递给 SQL Server 并对其进行解析以在服务器上加载 TVP。请参阅使用 JSON 数据。从 JavaScript 来说,这是将批量数据传递到 SQL Server 的最佳方式。

在较旧的 SQL Server 版本上,对于不支持表值参数的客户端,您可以使用 XML、加载临时表或只调用如下过程:

declare @rights as TpUserRights

insert into @rights(ConfigId,FormId) 
values (@ConfigId,@FormId)

exec SpMergeUserRights @rights 

@ConfigId和的绑定参数@FormId。并且要么为更多行绑定附加参数,要么多次调用该过程。


推荐阅读