2012-06-07 4 views
0

여러 테이블에 표시된 계층 구조의 텍스트 인쇄물을 만들려고합니다. 표는 다음과 같다 :SQL Server 인쇄 테이블 계층 구조?

create table #par1 (par1_id int primary key identity, par1_data varchar(8)) 
create table #par2 (par2_id int primary key identity, par1_id int , par2_data varchar(8)) 
create table #par3 (par3_id int primary key identity , par2_id int , par3_data varchar(8)) 
create table #par4 (par4_id int primary key identity , par3_id int , par4_data varchar(8)) 
create table #par5 (par5_id int primary key identity, par4_id int , par5_data varchar(8)) 

insert into #par1 values ('a') 
insert into #par1 values ('b') 
insert into #par1 values ('c') 
insert into #par1 values ('c') 

insert into #par2 values (1 , 'aa') 
insert into #par2 values (2 , 'bb') 
insert into #par2 values (3, 'cc') 
insert into #par2 values (4, 'cc') 

insert into #par3 values (1 , 'aaa') 
insert into #par3 values (2 , 'bbb') 
insert into #par3 values (3 , 'ccc') 
insert into #par3 values (4 , 'ddd') 

insert into #par4 values (1 , 'aaaa') 
insert into #par4 values (2 , 'bbbb') 
insert into #par4 values (3 , 'cccc') 
insert into #par4 values (4 , 'dddd') 

insert into #par5 values (1 , 'wwwww') 
insert into #par5 values (1 , 'xxxxx') 
insert into #par5 values (1 , 'yyyyy') 
insert into #par5 values (1 , 'zzzzz') 

나는 올바른 형식을 생성 http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm의 코드로 주위 monkeyed,하지만 난 그 단일 테이블 구조에서 휴식 여러 테이블 채굴 할 수 없습니다. 이러한 종류의 결과를 얻으려면 TSQL의 모양이 무엇입니까?

감사합니다.

답변

1

데이터베이스의 중간 계층 코드와 비슷합니다.

그러나 스크립트에 똑바로 덧붙 T-SQL,

은 이것이다 :

CREATE TABLE #allPar (id int IDENTITY (1,1), originalID int, originalTable int, parentID int NULL, data varchar(8)) 

INSERT INTO [#allPar] ([originalID], [originalTable], [data]) 
SELECT [par1_id], 1, [par1_data] FROM #par1; 

INSERT INTO [#allPar] ([originalID], [originalTable], [parentID], [data]) 
SELECT [par2_id], 2, [id], [par2_data] FROM #par2 INNER JOIN #allPar ON [#allPar].[originalID] = [#par2].[par1_id] AND [#allPar].[originalTable] = 1; 

INSERT INTO [#allPar] ([originalID], [originalTable], [parentID], [data]) 
SELECT [par3_id], 3, [id], [par3_data] FROM #par3 INNER JOIN #allPar ON [#allPar].[originalID] = [#par3].[par2_id] AND [#allPar].[originalTable] = 2; 

INSERT INTO [#allPar] ([originalID], [originalTable], [parentID], [data]) 
SELECT [par4_id], 4, [id], [par4_data] FROM #par4 INNER JOIN #allPar ON [#allPar].[originalID] = [#par4].[par3_id] AND [#allPar].[originalTable] = 3; 

INSERT INTO [#allPar] ([originalID], [originalTable], [parentID], [data]) 
SELECT [par5_id], 5, [id], [par5_data] FROM #par5 INNER JOIN #allPar ON [#allPar].[originalID] = [#par5].[par4_id] AND [#allPar].[originalTable] = 4; 

DECLARE @text [varchar](MAX); 
SET @text = ''; 
WITH Recursed 
AS 
(
-- Anchor member definition 
    SELECT [id], [originalID], [originalTable], [parentID], [data], 0 AS [Level], [originalID] AS rootID 
    FROM #allPar [ap] WHERE [ap].[parentID] IS NULL 
    UNION ALL 
-- Recursive member definition 
    SELECT [ap].[id], [ap].[originalID], [ap].[originalTable], [ap].[parentID], [ap].[data], [apParent].[Level] + 1, [rootID] 
    FROM #allPar [ap] INNER JOIN Recursed [apParent] 
     ON ap.[parentID] = [apParent].[id] 
) 
SELECT @text = @text + REPLICATE('-', [Level] * 4) + [data] + CHAR(13) + CHAR(10) FROM [Recursed] ORDER BY [rootID], [Level], [originalID] 
PRINT @text 
+0

감사합니다,하지만 #allPar에 테이블을 평평하게, 내 실제 테이블이 큰 행 수백만, 그리고 스키마를 변경하여 일부 인쇄 문을 작성하면 DBA가 화가 날 수 있습니다. – Snowy

+0

@Snowy - 수백만 행을 인쇄하고 싶습니까? 이제 * 정말 * 중간 계층의 관심사처럼 보입니다. –

+0

코드에 대한 도움을 찾고있었습니다. 실제 쿼리에는 물론 Where 절이 있습니다. 서버/지원 엔지니어가 sqlcmd 이외의 응용 프로그램에 의존하지 않고 실행할 수있는 백 엔드 지점 검사 작업을 돕고 있습니다. 그리고 나는 붙어있다. :) – Snowy

관련 문제