使用WHILE LOOP插入连接表

时间:2016-11-03 03:41:49

标签: sql tsql

我正在使用以下查询插入一个JunctionTable,用于匹配一个yellowpages目录的2个表(Listing& Categories)。

任何给定的清单都可以归为一个或多个类别。

以下查询将3个记录插入到我的Junction表中,但有1个问题。我有3个字段(ID,Junc_LID,Junc_CatID)代表我的另外两个表中的ID列LID是列表ID,而CatID是类别ID。

运行查询是在CatID字段中添加3条带1,2,43,34的记录,而不是每次插入4次不同的catID。

因此,如果用户从我的网络表单中选择10个类别。对于用户选择的每个类别,查询应循环10次,将10行插入到我的JunctionTable 1中。每个插入输入1个CatID,而不是现在用逗号分隔的所有类别的字符串。

enter image description here

DECLARE @cnt INT = 0;

WHILE @cnt < 3
BEGIN
INSERT INTO BND_ListingJunction_testing (Junc_LID,Junc_CatID)
Values ('[PulledLID]','[CatID]') 
SET @cnt = @cnt + 1;
END;

-------------------------------------- UPDATE

以下是为我的令牌修改的查询。它确实有效,但在我的联结表中添加了一些额外的插入,我不知道它们来自哪里。

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

enter image description here

第1-7行都来自同一个只执行一次的插入。

1 个答案:

答案 0 :(得分:3)

试试这个

  DECLARE @CatIDStr VARCHAR(100) = '1,2,43,34',@CatID VARCHAR(100) = ''
  DECLARE @PulledLID INT = 1
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 (@PulledLID,@CatID) 

END