2016-11-20 48 views
0

我很难找出正确的方法来管理以下情况。从JunctionTable更新/删除TSQL

我有3个表分类,上市,结

我使用的是结表我的分类&清单表之间的许多一对多的关系,我的清单表内的任何给定的记录可以分配1或类别表中的许多类别。

我已经想出了如何正确插入两者。现在我的困境是更新。

如果用户想要将他们的列表更新为新的类别,那么我的代码需要删除JunctionTable中的任何现有记录并用新的记录替换。我怎样才能编写一个完成这个的SQL语句?

这些是我添加列表时触发的两条插入语句。

INSERT INTO BND_Listing_testing 
(Company,Doors,Address,Address2,City,Region,Country,PostalCode,Lat,Long,Phone,Fax,Website,Description,Actualized,Verified,IMG1,IMG2,IMG3,IMG4,DateAdded) 
VALUES 
('[Company]','[Doors]','[Address]','[Address2]','[City]','[Region]','[Country]','[PostalCode]','[Lat]','[Long]','[Phone]','[Fax]','[Website]','[Description]','[Actualized]','[Verified]','[Image1]','[Image2]','[Image3]','[Image4]','[DateAdded]') 

select scope_identity() 

我存储上面查询的身份令牌[ScopedLID]以下查询

DECLARE @CatIDStr VARCHAR(100) = '[CatID]',@CatID VARCHAR(100) = '' 

WHILE LEN(@CatIDStr) > 0 
BEGIN 

    IF CHARINDEX(',',@CatIDStr) = 0 
    BEGIN 
     SET @CatID = @CatIDStr 
     SET @CatIDStr = '' 
    END 
    ELSE 
    BEGIN 
    SELECT @CatID = SUBSTRING(@CatIDStr,0,CHARINDEX(',',@CatIDStr))           
    SELECT @CatIDStr=SUBSTRING(@CatIDStr,CHARINDEX(',',@CatIDStr)+1,LEN(@CatIDStr)) 
    END 

    INSERT INTO BND_ListingJunction_testing (Junc_LID,Junc_CatID) 
    Values ('[ScopedLID]',@CatID) 

END 
+1

使用触发器? https://msdn.microsoft.com/en-us/library/ms178110.aspx – DVT

+0

@DVT感谢您的建议,我会阅读该页面。 – UserSN

回答

2

使用事务。在该事务中,首先删除指定列表的联结表中的所有行,然后为列表和类别的所选组合添加新行。

+0

@rd_neilsen你会碰巧有一个例子,我可以看一个例子的页面? – UserSN

+1

我没有一个与您的代码直接相关的示例,但您真正需要做的只是在上述两个代码块之间添加一条删除命令:“从BND_ListingJunction_testing中删除,其中Junc_LID = ScopedLID;”包装这个删除语句和你的代码在事务中将数据插入到联结表中只是防止数据丢失。 –