2013-03-15 2 views
1

나는 데이터베이스 이메일을 위해 다음과 같은 T-SQL을 가지고있다.xquery를 사용하여 html로 변환 하시겠습니까?

-- create proc TableToHtml @table varchar(max) as 
declare @table varchar(max) = '(select 1 a, ''one'' b union all select 2, ''two'') t ' 
declare @sql varchar(max) = ' 
    declare @xml xml = (
     select * from ' + @table + ' 
     for xml path(''tr''), root(''table'') 
    ); 
    select @xml' 
declare @tmp table (x xml) 
insert into @tmp exec(@sql) 
declare @x xml = (select x from @tmp) 
select @x 

그것은

<table> 
    <tr> 
    <a>1</a> 
    <b>one</b> 
    </tr> 
    <tr> 
    <a>2</a> 
    <b>two</b> 
    </tr> 
</table> 

반환 그것은 다음 HTML을 반환 할 수있는 XQuery를 쓸 수 있습니까?

<table> 
    <tr> 
    <th>a</th> 
    <th>b</th> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td>one</td> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td>two</td> 
    </tr> 
</table> 

답변

2

나는 덜 해킹하는 소리를 알아 냈습니다. 유일한 문제는 값이 null 인 경우 <td></td> 대신 <td />이 생성된다는 것입니다. 일부 오래된 Outlook 클라이언트로 이메일을 보내면 레이아웃 문제가 발생할 수 있습니다.

0

주요 해킹 경보!

declare @xml xml = (
    select * from (
     select 'a' + '</th><th>' + 'b' as th, null as td 
     union all 
     select null, '1' + '</td><td>' + 'one'  
     union all 
     select null, '2' + '</td><td>' + 'two'  
    ) t 
    for xml path('tr'), root('table') 
); 
select cast(replace(replace(cast(@xml as varchar(max)), '&lt;/th&gt;&lt;th&gt;', '</th><th>'), '&lt;/td&gt;&lt;td&gt;', '</td><td>') as xml) 

출력 :

<table> 
    <tr> 
    <th>a</th> 
    <th>b</th> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td>one</td> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td>two</td> 
    </tr> 
</table> 

해킹 목록 :

    여기가이 일을 더 우아한 방법은 아마도,하지만 빠른 해킹

  • nulls부터 g까지 사용 같은 "열"을 명시 적으로
  • 헤더 값 A와 B
  • 연결하여 열 값을 추가하고 명시 적으로
  • 을 VARCHAR 중앙
  • 변환 XML의 끝을 넣고 시작 태그에있는 등의 일 및 TD는 소독 바꾸기 꺾쇠 괄호 버전과 해당 태그의 버전은
  • 이의

대부분은 아마도 아마도 당신의 입/데이터에서 수집 변수를 사용하는 리팩토링 할 수있는 XML로 다시 변환합니다.

참고 : 일반적으로

말하기, 당신은 당신의 프리젠 테이션 계층 당신을 위해 HTML을 생성 할 수 있습니다. DB에서 테이블에서 html을 생성하는 제네릭 함수를 만들 수는 있지만 이미이를 수행하도록 설계된 많은 훌륭한 프레젠테이션 클래스, 컨트롤 등이 있습니다. 응용 프로그램은 거의 항상 데이터베이스보다 확장 성이 좋습니다.

관련 문제