gpt4 book ai didi

sql - 从表值参数中插入或更新或删除数据

转载 作者:行者123 更新时间:2023-12-04 23:42:58 25 4
gpt4 key购买 nike

我有一个 ProductsAttributesValues 表,其中有,

Id   ProductId   AttributeId   Value   ORDER
-------------------------------------------------

具有属性(相同的 ProductId/AttributeId)的产品可以有多个值但具有不同的订单。我有一个类型,

CREATE TYPE [dbo].[ProductsAttributesValuesType] AS TABLE
(
[AttributeId] [INT],
[Value] [NVARCHAR](MAX)
)

我在我的存储过程中将此 ProductsAttributesValuesType 作为带有 ProductId 参数的表值参数传递。现在我需要的似乎很简单,但我被卡住了。 ProductsAttributesValuesType 中的信息来自 UI。所以,

1) 如果值为 null、空或空白,那么我不需要执行任何操作并从 ProductsAttributesValues 中删除具有相同 ProductId/AttributeId 的所有现有记录。

2) 如果值不为空或非空或非空白,则可能有单个值或多个值(ProductsAttributesValuesType 中的多个记录)。如果有单个值,如果不存在现有值,我需要插入,如果值存在,则更新。如果有多个值(ProductsAttributesValuesType 中的多个记录),如果不存在现有值,我需要插入所有值,如果存在值,则更新/插入。

一种方法是简单地删除所有具有相同 ProductId/AttributeId 的 ProductsAttributesValues 表。然后插入具有非空值的值。但是我觉得效率不是很高。

更新:目前,我首先删除所有多值属性值。接下来,我将删除值为空的所有属性值。接下来,我将插入/更新单值属性值。接下来,我将插入多值属性值。

最佳答案

避免使用 Merge 语句将其分解为三个语句并将其全部包装在一个事务中,如下所示

CREATE  Procedure Upserting_To_ProductsAttributesValues 
@ProductsAttributesValuesType [dbo].[ProductsAttributesValuesType] READONLY
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;

-- Delete values
DELETE FROM ProductsAttributesValues
FROM ProductsAttributesValues T INNER JOIN @ProductsAttributesValuesType P
ON T.AttributeId = P.AttributeId
WHERE P.Value IS NULL OR RTRIM(LTRIM(P.Value)) = ''

-- Update Statement
UPDATE T
SET T.Value = P.Value
FROM ProductsAttributesValues T INNER JOIN @ProductsAttributesValuesType P
ON T.AttributeId = P.AttributeId

-- Insert Statement
INSERT INTO ProductsAttributesValues (AttributeId, Value)
SELECT AttributeId, Value
FROM @ProductsAttributesValuesType P
WHERE NOT EXISTS (SELECT 1
FROM ProductsAttributesValues
WHERE AttributeId = P.AttributeId)

COMMIT TRANSACTION; --<-- If nothing went wrong
END TRY

BEGIN CATCH


-- Now make use of ERROR Functions to get detailed information
-- about the error, these functions are only allowed in catch block

SELECT ERROR_MESSAGE() AS [ERROR_MESSAGE]
,ERROR_LINE() AS [ERROR_LINE]
,ERROR_NUMBER() AS [ERROR_NUMBER]
END CATCH

END

注意

我建议避免使用 Merge 语句的原因请参阅 Aaron Bertrand 撰写的这篇文章 Use Caution with SQL Server's MERGE Statement

关于sql - 从表值参数中插入或更新或删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23659376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com