2010-04-01 6 views
3

임의의 SQL을 사용하여 반환 된 열의 데이터 형식을 얻고 싶습니다. 진술은 여러 테이블, 뷰, TVF 등을 결합 할 수 있습니다. 쿼리를 기반으로 뷰를 생성하고이를 통해 데이터 유형을 얻을 수 있다는 것을 알고 있습니다. 더 빠른 방법이 필요합니다. 오직 내가 SQL을 실행하고 결과를 조사하기 위해 .net 유틸리티를 작성하고 TSQL 응답이 있는지 궁금해하고 있다고 생각할 수 있다고 생각합니다. (,) NVARCHAR (255 null이되지 않음) :SQL Server 2008의 임의의 SQL 문에서 데이터 형식 가져 오기


을 감안할 때 (진짜 테이블 단지 예)

SELECT p.Name AS PersonName, p.Age, a.Account as AccountName 
FROM Person as p 
LEFT JOIN Account as a 
    ON p.Id = a.OwnerId 

나는

으로 PersonName 같은 것을하고 싶습니다

나이 : (smallInt, not null)

+0

@HLGEM 원본 시스템의 일부 쿼리 스키마와 일치하는 일부 테이블을 데이터 마트에 작성해야합니다. –

답변

1
/*you may have to alias some columns if they are not unique*/ 
    /*EDIT: added fix for 2byte nchar/nvarchar */ 
    SELECT top (1) /*<your query columns here>*/ 
    INTO #tmp99 
    /*<rest of your query here>*/ 


    SELECT 'CREATE TABLE [tablename](' UNION ALL 
    SELECT CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) = 1 THEN '' ELSE ',' END 
    + CHAR(13) + '[' + c.name + '] [' + t.name + ']' 
    + CASE WHEN c.system_type_id IN (165,167,173,175) 
      THEN CASE WHEN c.max_length <> -1 
        THEN '(' + CAST(c.max_length AS varchar(7)) + ')' 
        ELSE '(max)' 
        END 
      WHEN c.system_type_id IN (231,239) 
      THEN CASE WHEN c.max_length <> -1 
        THEN '(' + CAST(c.max_length/2 AS varchar(7)) + ')' 
        ELSE '(max)' END 
      ELSE 
       CASE WHEN c.system_type_id IN (41,42,43) 
        THEN '(' + CAST(c.scale AS varchar(7)) + ')' 
        ELSE 
         CASE WHEN c.system_type_id IN (106,108) 
          THEN '(' + CAST(c.precisiON AS varchar(7)) + ',' + CAST(c.scale AS varchar(7)) + ')' 
          ELSE '' 
          END 
        END 
      END 

    + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END 

    FROM tempdb.sys.columns c 
    JOIN tempdb..sysobjects o ON (c.object_id = o.id) 
    JOIN tempdb.sys.types t ON (t.user_type_id = c.user_type_id) 
    WHERE o.name LIKE '#tmp99%' 
    UNION ALL SELECT ')' 
    FOR XML PATH('') 

    DROP TABLE #tmp99 
+0

그것은 꽤 산뜻하고 잘 작동하는 것 같습니다. 2 바이트 필드 (예 : nvarchar (255)가 nvarchar (510)로 변경됨)에 길이가 맞지 않아 system_type_id IN (231,239)에 대해 길이를 2로 나누는 또 다른 사례를 추가했습니다. –

+0

이번 주말에 해결하겠습니다. 나는 그것을 상당히 빨리 던져 버렸기를 바란다. 적어도 당신에게 필요한 것을 좋은 시작으로 줄 것이다. –

+0

스코틀랜드에 감사 드린다. 나는 단지 아래를 추가하고 첫 번째 경우에서 231과 239를 제거 했으므로 나에게 잘 맞는다. (231,239)를 IN c.system_type_id WHEN THEN CASE WHEN c.max_length <> -1 THEN '('+ CAST (c.max_length/2 AS VARCHAR (7)) + ')' ELSE '(최대) ' END –

0

나는이 목표를 달성하려고 노력했지만 너무 어려워졌습니다. 내가 어떻게 접근했는지 알려주지. SQL 구문 분석기 (http://www.sqlparser.com/download.php 및 C#)를 사용했습니다. 그런 다음 텍스트를 분석하려고했습니다. 간단한 쿼리의 경우에는 문제가 없지만 곧 너무 복잡해집니다. 보기에 대한 아이디어는 훨씬 간단 해 보입니다.