데이터베이스(고전 부자 급 ID 관련)업데이트 문제

어제 한 동료 가 보 낸 데이터베이스 제목 은 바로 어떤 전형 적 인 부자 급 ID 가 같은 데이터베이스 시트 에서 디자인 유형 입 니까?원 표 에 필드 를 추가 하 는 동시에 이 노드 의 부자 급 상세 정 보 를 원 표 에 추 가 된 필드 에 삽입 해 야 합 니 다.구체 적 인 효 과 는 다음 그림 과 같 습 니 다.
AreaCode,AreaName,ParentCode(원 표 3 필드).Content필드 를 추가 합 니 다.이 areaCode 의 모든 부모 급 메뉴 정 보 를 원 표 에 추 가 된 Content 필드 아래 에 업데이트 하고 빨 간 선 으로 상자 합 니 다.(뜻 은 알 겠 죠?)
AreaCode:지역 ID AreaName:지역 소개 ParentCode:부모 급 AreaCode(Content-이 AreaCode 에 있 는 모든 부모 급 AreaName 을 유사 하 게 조합:월성,소 흥 시,절강성 문자열 삽입)
업데이트 전:

업데이트 후:

프로젝트 에 서 는 이러한 내용 에 비해 메모리 에 저장 되 어 캐 시 로 사용 되 며 데이터 베 이 스 를 자주 연결 하지 않 고 성능 문 제 를 가 져 옵 니 다.
       코드 가 올 라 가지 않 으 면 간단 한 재 귀 를 통 해 이 루어 질 수 있다.
1.데이터베이스 에서 이 표 의 모든 내용 을 꺼 내 캐 시 합 니 다.(데 이 터 는 3000 개 정도 차이 가 난다)
2.재 귀 함 수 를 작성 하고 매번 들 어 오 는 AreaCode(첫 번 째 캐 시 데이터베이스 에서 꺼 낸 전체 표 집합 은 Dictionary형식 으로 전환 할 수 있 습 니 다)에 따라 Parent Code 값 을 가 져 옵 니 다.Parent Code 가 0(즉,최상 위 노드 가 아 닌 Parent Code 가 최상 위 노드)이 아니라면 이 함 수 를 계속 호출 합 니 다.이번 검색 실체의 ParentCode 정 보 를 입력 합 니 다.
3  코드 에 서 는 부모 노드 의 모든 정 보 를 쉽게 찾 을 수 있 고 데이터 베이스 로 업데이트 하면 됩 니 다.
  청해 의 풍파 에 감사 하 다  grayboy 는 공용 표 표현 식 을 통 해 충분히 완성 할 수 있 습 니 다.
코드 는 다음 과 같 습 니 다.

with cte(areacode,areaName,content) as
(
---    ParentCode   0 (ParentCode   0       )
select areacode,areaName,cast(areaName as varchar(50)) AS content
from [AreaRegion] where parentcode=0
union all
--         
select a.areacode,a.areaName,cast(a.content+','+b.areaName as varchar(50) AS content 9 from [AreaRegion] a 10 inner join cte b on a.parentcode=b.areacode )
select * from cte
---건물 주 는 당초 생각(SB 를 복잡 하 게 생각 했다)
1 층 주인 이 가장 먼저 생각 한 것 은 바로 커서 로 전체 표 기록 을 저장 하 는 것 이다.
2.커서 는 매번 기 록 된 areaCode 를 얻 은 다음 에 이 areaCode 를 통 해 모든 부모 표(자신 포함)정 보 를 찾 아 낸 다음 에 조 회 된 이 표 의 한 필드 를 문자열 로 맞 춥 니 다.
표 변수 에 삽입 합 니 다(두 필드 는 각각 AreaCode,Content).
3.마지막 으로 정 의 된 표 변 수 를 원래 표 와 INNER JOIN(표 변수 에 areaCode 필드 삽입)을 통 해 연결 표를 업데이트 합 니 다.
스 크 립 트 업데이트:

USE JKCRM
GO
--    
DECLARE updateCursor CURSOR SCROLL FOR
SELECT A.AreaCode  FROM DBO.AreaRegion A
--    
OPEN updateCursor
--              
DECLARE @aID NVARCHAR(30)=''
---              
DECLARE @pStr NVARCHAR(300)='';
--            AreaCode Content ( Content :            )
DECLARE @TempTable TABLE
(
AreaCode INT PRIMARY KEY,
Content NVARCHAR(3000)
)
--                @AID
FETCH FIRST FROM updateCursor INTO @AID

WHILE(@@FETCH_STATUS=0)
BEGIN
--PRINT(@AID)   ;
---      @AID ,           
WITH TB AS
(
   ---                       
   SELECT A.*,0 AS LEVEL FROM JKCRM.DBO.AreaRegion A 
   WHERE A.AreaCode=@AID
   UNION ALL
   SELECT B.* ,LEVEL+1 AS LEVEL FROM TB A INNER JOIN JKCRM.DBO.AreaRegion B
   ON A.ParentCode=B.AreaCode 
)
---                       SELECT     
SELECT @pStr=@pStr+  CASE 
WHEN @pStr='' THEN TB.AreaName ELSE ','+TB.AreaName END 
FROM TB ORDER BY TB.LEVEL ASC
 -- PRINT(@pSTR)
 --     
INSERT INTO @TempTable SELECT @aID,@pStr
---      AreaCode        @pStr   
SET @pStr=''
 FETCH NEXT FROM updateCursor INTO @AID
END

--SELECT B.AreaCode,B.AreaName,B.ParentCode,A.Content,A.AreaCode
--FROM @TempTable A RIGHT JOIN DBO.AreaRegion B ON A.AreaCode=B.AreaCode ORDER BY   B.AreaCode

 ---        UPDATE     
 UPDATE A SET A.Content=B.Content  FROM   DBO.AreaRegion A
 INNER JOIN @TempTable B ON A.AreaCode=B.AreaCode

--      
CLOSE updateCursor
DEALLOCATE updateCursor
원본 스 크 립 트 SQL

/*
Navicat SQL Server Data Transfer

Source Server     : SQL
Source Server Version : 120000
Source Host      : .:1433
Source Database    : JKCRM
Source Schema     : dbo

Target Server Type  : SQL Server
Target Server Version : 120000
File Encoding     : 65001

Date: 2015-06-12 11:20:40
*/


-- ----------------------------
-- Table structure for AreaRegion
-- ----------------------------
DROP TABLE [dbo].[AreaRegion]
GO
CREATE TABLE [dbo].[AreaRegion] (
[AreaCode] varchar(10) NOT NULL ,
[AreaName] varchar(50) NULL ,
[ParentCode] varchar(10) NULL ,
[Content] nvarchar(200) NULL 
)


GO

-- ----------------------------
-- Records of AreaRegion
-- ----------------------------
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110000', N'   ', N'0', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110100', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110200', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110300', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110400', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110500', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110600', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110700', N'    ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110800', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'110900', N'    ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111000', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111100', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111200', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111300', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111400', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111500', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111600', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111700', N'   ', N'110000', null)
GO
GO
INSERT INTO [dbo].[AreaRegion] ([AreaCode], [AreaName], [ParentCode], [Content]) VALUES (N'111800', N'   ', N'110000', null)

좋은 웹페이지 즐겨찾기