데이터베이스(고전 부자 급 ID 관련)업데이트 문제
AreaCode,AreaName,ParentCode(원 표 3 필드).Content필드 를 추가 합 니 다.이 areaCode 의 모든 부모 급 메뉴 정 보 를 원 표 에 추 가 된 Content 필드 아래 에 업데이트 하고 빨 간 선 으로 상자 합 니 다.(뜻 은 알 겠 죠?)
AreaCode:지역 ID AreaName:지역 소개 ParentCode:부모 급 AreaCode(Content-이 AreaCode 에 있 는 모든 부모 급 AreaName 을 유사 하 게 조합:월성,소 흥 시,절강성 문자열 삽입)
업데이트 전:
업데이트 후:
프로젝트 에 서 는 이러한 내용 에 비해 메모리 에 저장 되 어 캐 시 로 사용 되 며 데이터 베 이 스 를 자주 연결 하지 않 고 성능 문 제 를 가 져 옵 니 다.
코드 가 올 라 가지 않 으 면 간단 한 재 귀 를 통 해 이 루어 질 수 있다.
1.데이터베이스 에서 이 표 의 모든 내용 을 꺼 내 캐 시 합 니 다.(데 이 터 는 3000 개 정도 차이 가 난다)
2.재 귀 함 수 를 작성 하고 매번 들 어 오 는 AreaCode(첫 번 째 캐 시 데이터베이스 에서 꺼 낸 전체 표 집합 은 Dictionary
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)