我对问题标题的描述很差,因为我不确定该怎么称呼我应该做的事情,但它确实应该很简单。
我有一个带有两个ID列的链接/连接表。我想在将新行保存到表之前运行检查。
用户可以通过网页保存属性,但我需要在保存之前检查相同的组合是否存在。使用一条记录很容易,因为显然你只是检查该属性是否已经在表中,如果它不允许它们再次保存它。
但是,如果用户选择该属性和另一个属性的组合,则应允许他们保存该属性。
这是我的意思的图像:
因此,如果用户现在尝试保存ID为1的属性,它将停止它们,但是如果他们尝试ID为1,10,我需要它也停止它们,只要1和10都具有相同的productAttributeId。
我在解释中对此感到困惑,但我希望这张图片能说明我需要做些什么。
这应该很简单所以我认为我错过了一些东西。
答案 0 :(得分:0)
如果我正确理解了问题,您希望阻止重复使用AttributeId
和ProductAttributeId
的组合。如果是这种情况,只需将它们组合成一个主键,这本质上是UNIQUE
。
如果这不可行,请创建一个存储过程,针对AttributeId
的实例运行针对连接的查询。如果查询返回0个实例,请插入该行。
这里有一些轻量代码来展示这个想法(可能需要修改才能使用你的数据库):
SELECT COUNT(1) FROM MyJoinTable WHERE AttributeId = @RequestedID
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO MyJoinTable ...
END
答案 1 :(得分:0)
您可以通过存储过程控制插入。我的理解是
这些需要作为针对(new?)productAttributeId的单个“批处理”输入表格
因此,如果选择(1,10),则需要阻止,因为1-2和10-2已经存在。
存储过程应将属性作为单个列表,例如'1,2,3'(逗号分隔,没有空格,只有整数)
然后,您可以使用字符串拆分UDF或内联XML技巧(如下所示)将其分解为派生表的行。
测试表
create table attrib (attributeid int, productattributeid int)
insert attrib select 1,1
insert attrib select 1,2
insert attrib select 10,2
这里我使用变量,但您可以合并为SP输入参数
declare @t nvarchar(max) set @t = '1,2,10'
select top(1)
t.productattributeid,
count(t.productattributeid) count_attrib,
count(*) over () count_input
from (select convert(xml,'<a>' + replace(@t,',','</a><a>') + '</a>') x) x
cross apply x.x.nodes('a') n(c)
cross apply (select n.c.value('.','int')) a(attributeid)
left join attrib t on t.attributeid = a.attributeid
group by t.productattributeid
order by countrows desc
输出
productattributeid count_attrib count_input
2 2 3
如果比较最后2列和计数