2008-10-31 34 views
4

我需要一種聰明的方式,以可以在CREATE TABLE語句中使用的方式從INFORMATION_SCHEMA.COLUMNS中獲取數據類型。問題是需要了解的「額外」字段,例如NUMERIC _ PRECISION和NUMERIC _ SCALE。如何使用圓括號和所有內容獲取SQL Server列定義?

很明顯,我可以忽略INTEGER的列(精度爲10,刻度爲0),但還有其他類型,比如NUMERIC。因此,如果不編寫大量代碼來解析表,有關如何從列定義中獲取某種字段簡寫的想法?

我希望能夠得到這樣的: INT, 日期時間, 錢, 數字**(10,2)**

回答

4

下面是一個更新(騙人貨!)的GalacticCowboy's answer解決一些問題,並更新所有的(我認爲)的SQL Server 2008個R2數據類型:

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

SMO腳本應該照顧腳本代。我相信這是MS在SQL Management Studio中用於腳本生成的內容。

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

@YourComment -​​

這是你問什麼。簡而言之,您將不得不解析信息模式視圖結果。

+0

我不是真的想要整個表的腳本。我試圖在生成的XQuery中包含可解析的數據類型 – 2008-10-31 12:39:32

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 2008-10-31 12:57:33

+0

我已添加此答案的[更新版本](http://stackoverflow.com/a/11234044/880904)。 – 2012-06-27 20:04:55

1

如果您使用SMO您可以通過訪問Column Object

Column.Property [ 「NumericScale」]的屬性總彙同時獲得精確度和規模。價值

Column.Property [ 「NumericPrecision」]值

+1

感謝您的回覆。僅供參考,語法使用「屬性」而不是「屬性」。例如:Column.Properties [「NumericScale」]。值 – Tarzan 2013-01-21 23:03:54

相關問題