【发布时间】:2014-05-14 15:46:29
【问题描述】:
我有一个 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,但我被卡住了。你能解决这个问题吗?
-
包括您迄今为止尝试过的内容以及一组源/结果示例。
-
我认为您在上一段中描述的方法可能会导致最干净的代码。我不会担心性能。一些更新与删除/插入之间的区别不会那么大。
-
@GordonLinoff,感谢您的专家意见
标签: sql sql-server sql-server-2012