如何使用 json 在单个过程中运行 CRUD?(T-SQL)

Posted

技术标签:

【中文标题】如何使用 json 在单个过程中运行 CRUD?(T-SQL)【英文标题】:How to run CRUD in single procedure by using json?(T-SQL) 【发布时间】:2020-12-29 23:12:01 【问题描述】:

程序

ALTER PROCEDURE [dbo].[SpProductTsk]
    (@json varchar(MAX))
AS
    ----insert---
BEGIN
    DECLARE @SelectedProcedure varchar(max) = ''

    IF @SelectedProcedure = 'SpProductIns'
    BEGIN
        INSERT INTO [dbo].[Product](ProductName, ProductCategory, InsertPersonId, InsertDate)
            SELECT 
                p.productName, p.productCategory,
                p.insertPersonId, GETDATE()
            FROM
                OPENJSON(@json)
            WITH
                (productName varchar(50) '$.ProductName',
                 productCategory varchar(50) '$.ProductCategory',
                 insertPersonId int '$.InsertPersonId',
                 insertDate datetime '$.InsertDate') AS p

        ----SELECT-----
        IF @SelectedProcedure = 'SpProductSelect'
        BEGIN
            SELET p.productName, p.productCategory 
            FROM [dbo].[Product] AS p
            FOR JSON PATH, ROOT('ProductDetails')
        END

        -----UPDATE-----
        IF @SelectedProcedure = 'SpProductUpd'
        BEGIN
            DECLARE @ProductId int,
                    @ProductName varchar(50),
                    @ProductCategory varchar(50),
                    @InsertPersonId int

            SELECT 
                @ProductId = p.productId,
                @ProductName = p.productName,
                @ProductCategory = p.productCategory,
                @InsertPersonId = p.insertPersonId
            FROM
                OPENJSON (@Json)
            WITH
                (productId int '$.ProductId',
                 productName varchar(50) '$.ProductName',
                 productCategory varchar(50) '$.ProductCategory',
                 insertPersonId int '$.InsertPersonId') AS p

            UPDATE [dbo].[Product]
            SET productName = @ProductName,
                productCategory = @ProductCategory,
                insertPersonId = @InsertPersonId
            WHERE ProductId = @ProductId
        END

        ----Delete---
        IF @SelectedProcedure = 'SpProductDel'
        BEGIN
            DECLARE @Id int

            SELECT @Id = p.productId
            FROM OPENJSON(@json)
            WITH (productId int '$.ProductId') AS p

            DELETE FROM [dbo].[Product]
            WHERE ProductId = @Id
        END
    END
END

EXEC [dbo].[SpProductTsk] @json = '
    "SelectedProcedur":"SpProductIn",
    "ProductName":"Mutton",
    "ProductCategory":"Meat",
    "InsertPersonId":"1",
    "InsertDate":"" '

SELECT * FROM product

代码编译但显示插入了 0 行

【问题讨论】:

强烈怀疑 SQL Server 2005OPENJSON 方法 .... - 请将您的标签更新为您的实际版本使用 对于初学者 openjson 直到 sql server 2016 才引入,如先前的评论所示,请更新您的标签。其次,您声明并将 '@SelectedProcedure' 设置为空白,然后您的下一条语句是 IF '@SelectedProcedure = 'SpProductIns' 将始终为 false,因此它永远不会执行任何操作。 另外——这个“一个存储过程来做所有事情”一开始可能看起来非常聪明和漂亮——但这些往往变得笨拙且难以维护。我建议每个操作有一个过程 - 然后你可以让每个过程完全只做一件事,并且只采用真正需要的那些参数。它被称为单一职责原则,是良好系统设计的基本支柱之一 @TimMylott 在执行存储过程时使所选过程可读的确切方法是什么? @marc_s 根据您的建议,我已经完成了。但是我现在有下一个要求,所以我正在应用这种方法 【参考方案1】:

您需要从传递给存储过程的 json 中获取“SelectedProcedur”值。

在声明@SelectedProcedure 之后,将其设置为您传入的json 中的“SelectedProcedur”值。

DECLARE @SelectedProcedure VARCHAR(MAX) = '';

SET @SelectedProcedure = (
                             SELECT [value]
                             FROM   [OPENJSON](@json)
                             WHERE  [key] = 'SelectedProcedur'
                         );

您还需要修正 if 语句。您的所有代码都在“IF @SelectedProcedure = 'SpProductIns'”块内,因此其他 if 语句都不会被执行。

行前

----选择-----

添加

结束

然后删除底部的 END 之一。

【讨论】:

以上是关于如何使用 json 在单个过程中运行 CRUD?(T-SQL)的主要内容,如果未能解决你的问题,请参考以下文章

优化构建时间

如何在 drupal 中的自定义实体上定义和执行 CRUD

模型中带有 json 字段的 Django crud api

如何使用 tsconfig.json 中的设置从命令行键入检查单个文件?

将单个xml节点作为数组转换为json

无法在 JSON-SERVER 中执行 CRUD