如何使用 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 2005 有OPENJSON
方法 .... - 请将您的标签更新为您的实际版本使用
对于初学者 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)的主要内容,如果未能解决你的问题,请参考以下文章
模型中带有 json 字段的 Django crud api