2011-05-01 70 views
2

查看下面的代碼是在T-SQL的快速腳本建立獲取一類使用設置屬性:創建表名稱獲取設置屬性爲

DECLARE @COLUMN_NAME varchar(250) 
DECLARE @DATA_TYPE varchar(250) 
DECLARE c1 CURSOR FOR 

select COLUMN_NAME, DATA_TYPE from information_schema.columns 
where table_name = 'Members' 
OPEN c1 
FETCH NEXT FROM c1 INTO @COLUMN_NAME, @DATA_TYPE 
WHILE @@FETCH_STATUS = 0 
BEGIN 

IF @DATA_TYPE = 'nvarchar' 
BEGIN 
    SET @DATA_TYPE = 'string' 
END 

IF @DATA_TYPE = 'ntext' 
BEGIN 
    SET @DATA_TYPE = 'string' 
END 

IF @DATA_TYPE = 'datetime' 
BEGIN 
    SET @DATA_TYPE = 'DateTime' 
END 


PRINT 'public ' + @DATA_TYPE + ' ' + @COLUMN_NAME + ' { get; set; }' 

FETCH NEXT FROM c1 INTO @COLUMN_NAME, @DATA_TYPE 

END 
CLOSE c1 
DEALLOCATE c1 
GO 

,如果你可以給它添加或清理它,這將是偉大的!

UPDATE 下面的代碼工作,我做了一些細微的修改。

DECLARE @Script NVARCHAR(MAX) = '' 

SELECT @Script = @Script + ' 
public ' + CASE WHEN DATA_TYPE IN ('nvarchar','ntext') THEN 'string' 
       WHEN DATA_TYPE = 'datetime' THEN 'DateTime' 
       ELSE DATA_TYPE 
      END 
         + ' ' 
         + upper(substring(COLUMN_NAME,1,1))+ 
         + lower(substring(COLUMN_NAME,2,499)) 
         + ' { get; set; }' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'SubCategory' 

PRINT @Script 

回答

2

可以擺脫光標與

DECLARE @Script NVARCHAR(MAX) = '' 

SELECT @Script = @Script + ' 
public ' + CASE WHEN DATA_TYPE IN ('nvarchar','ntext') THEN 'string' 
       WHEN DATA_TYPE = 'datetime' THEN 'DateTime' 
       ELSE DATA_TYPE 
      END 
         + ' ' + COLUMN_NAME + ' { get; set; }' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Members' 

PRINT @Script 
+1

尼斯縮短了不少。我懶得發起SSMS來完成它; p和+1特別用於修復信息模式表中的外殼 - 在區分大小寫模式下很痛苦,否則。 – 2011-05-01 22:40:03

+0

喜歡它!好的一塊乾淨的編碼和易於遵循。做得好! – 2011-05-02 13:47:23

2

如果是你所需要的... 停止修修補補; p如果你想反饋:

  • 沒有必要的遊標;一套基於SELECT應該足夠了;任何時候你發現自己寫光標是可能錯誤
  • 要麼加入到映射表(SQL類型和C#類之間),或使用CASE ....挑選內嵌
  • 可能想成爲偏執保留字,例如public - 在C#中,您需要使用@public(或避免它)
  • 您可能想要刪除空格;你可以調用一個數據庫列[something with spaces],但不會工作在C#
  • 你可以檢查擴展元數據的MS_Description價值,並編寫成(的一個,或者兩者)///<summary>...</summary>[Description(@"...")]
0
declare @TableName sysname = 'Members' 
declare @result varchar(max) = '' 

select @result = @result + ' 
public ' + ColumnType + ' ' + ColumnName + ' { get; set; } 
' 
from 
(
    select replace(col.name, ' ', '_') ColumnName, 
     case typ.name 
      when 'bigint' then 'long' 
      when 'binary' then 'byte[]' 
      when 'bit' then 'bool' 
      when 'char' then 'char' 
      when 'date' then 'DateTime' 
      when 'datetime' then 'DateTime' 
      when 'datetime2' then 'DateTime' 
      when 'datetimeoffset' then 'DateTimeOffset' 
      when 'decimal' then 'decimal' 
      when 'float' then 'float' 
      when 'image' then 'byte[]' 
      when 'int' then 'int' 
      when 'money' then 'decimal' 
      when 'nchar' then 'char' 
      when 'ntext' then 'string' 
      when 'numeric' then 'decimal' 
      when 'nvarchar' then 'string' 
      when 'real' then 'double' 
      when 'smalldatetime' then 'DateTime' 
      when 'smallint' then 'short' 
      when 'smallmoney' then 'decimal' 
      when 'text' then 'string' 
      when 'time' then 'TimeSpan' 
      when 'timestamp' then 'DateTime' 
      when 'tinyint' then 'byte' 
      when 'uniqueidentifier' then 'Guid' 
      when 'varbinary' then 'byte[]' 
      when 'varchar' then 'string' 
     end ColumnType 
    from sys.columns col 
     join sys.types typ on 
      col.system_type_id = typ.system_type_id 
    where object_id = object_id(@TableName) 
) t 

print @result