2008-10-31 2 views
4

CREATE TABLE 문에서 사용할 수있는 방식으로 INFORMATION_SCHEMA.COLUMNS에서 데이터 유형을 가져 오는 좋은 방법이 필요합니다. 문제는 이해할 필요가있는 '추가'필드입니다 (예 : _ 숫자와 정밀도, 숫자는 _).괄호와 모든 것을 포함하는 SQL Server 열 정의를 얻으려면 어떻게해야합니까?

분명히 INTEGER (10의 정밀도와 0의 스케일)에 대한 열을 무시할 수 있지만 NUMERIC과 같이 관심을 가질만한 다른 유형이 있습니다. 따라서 테이블을 구문 분석하기위한 많은 코드를 작성하지 않고 열 정의에서 필드 정렬을 사용하는 방법에 대한 아이디어는 무엇입니까?

답변

4

여기에 업데이 트 (해적판 일!)입니다 GalacticCowboy's answer의 (내가 생각하는) SQL 서버 2008R2 데이터 유형 모두를위한 몇 가지 문제 및 업데이트를 해결하기 위해 :

select data_type + 
    case 
     when data_type like '%text' or data_type in ('image', 'sql_variant' ,'xml') 
      then '' 
     when data_type in ('float') 
      then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ')' 
     when data_type in ('datetime2', 'datetimeoffset', 'time') 
      then '(' + cast(coalesce(datetime_precision, 7) as varchar(11)) + ')' 
     when data_type in ('decimal', 'numeric') 
      then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ',' + cast(coalesce(numeric_scale, 0) as varchar(11)) + ')' 
     when (data_type like '%binary' or data_type like '%char') and character_maximum_length = -1 
      then '(max)' 
     when character_maximum_length is not null 
      then '(' + cast(character_maximum_length as varchar(11)) + ')' 
     else '' 
    end as CONDENSED_TYPE 
    , * 
from information_schema.columns 
order by table_schema, table_name, ordinal_position 
+1

새로운 데이터 유형 중 일부가 아닌 새로운 날짜/시간 유형은 무엇입니까? 'time','datetime2' 그리고'datetimeoffset'는 모두 DATETIME_PRECISION 컬럼에서 찾을 수있는 소수 자릿수 초의 정밀도를 취할 수 있습니다. – MattW

+1

@MattW 잘 잡으십시오, 나는 그 (것)들에 또한 datetime_precision를 포함하기 위하여 원본을 새롭게했습니다. 아마도 SQL Server 2016에서 모든 유형을 추가하는 작업을 할 것입니다. –

1

SMO 스크립팅 스크립트 세대의주의를 기울여야한다 INT, 날짜, 돈, 숫자 ** (10,2) ** :

내가 좋아하는 뭔가를 얻을 수 있도록하고 싶습니다. 나는 이것이 MS가 스크립트 생성을 위해 SQL Management Studio에서 사용하는 것이라고 생각한다.

http://msdn.microsoft.com/en-us/library/ms162153.aspx

@YourComment - I need a smart way to get the data types out of INFORMATION_SCHEMA.COLUMNS in a way that could be used in a CREATE TABLE statement

이 당신을 위해 무엇을 요구합니다. 그보다 짧 으면 정보 스키마 뷰 결과를 구문 분석해야합니다. 당신이 SMO를 사용하는 경우

+0

저는 전체 테이블을위한 스크립트가 필요 없습니다. 생성 된 XQuery에 포함 할 수있는 데이터 유형을 가져 오려고합니다. –

7
select column_type = data_type + 
    case 
     when data_type like '%text' then '' 
     when data_type like '%char' and character_maximum_length = -1 then '(max)' 
     when character_maximum_length is not null then '(' + convert(varchar(10), character_maximum_length) + ')' 
     when data_type = 'numeric' then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ', ' + 
      convert(varchar(10), isnull(numeric_scale, 0)) + ')' 
     else '' 
    end 
,* 
from information_schema.columns 
+0

varbinary (max)를 처리하지 않습니다 ... 오. – GalacticCowboy

+0

이 답변의 [업데이트 된 버전] (http://stackoverflow.com/a/11234044/880904)을 추가했습니다. –

1

당신은 Column Object

Column.Property [ "NumericScale"]의 속성 colletion에 액세스하여 정밀도와 규모 모두를 얻을 수 있습니다. 값

Column.Property을 [ . "NumericPrecision"] 값

+1

응답 해 주셔서 감사합니다. 참고로, 구문은 "속성"대신 "속성"을 사용합니다. 예 : Column.Properties [ "NumericScale"]. 값 – Tarzan

관련 문제