2014-12-01 33 views
-2

我正嘗試使用SQL來構建一個對象類,以備將來在我的應用程序中使用。基本上,你通過它通過一個表名,它會回報你的語法的類粘貼到C#SQL返回錯誤的訂單

它的工作原理到一個點,但有些項目是在一個奇怪的順序返回:

DECLARE @TableName VARCHAR(50) 
SELECT @TableName ='Users' 

select 'public class obj_' + @TableName + '{' 
union 

SELECT 'public '+ CASE WHEN t.name IN ('int', 'bigint') THEN 'Int32' 
      WHEN t.name IN ('nvarchar','varchar','text','ntext') THEN 'String' 
      WHEN t.name IN ('datetime','smalldatetime') THEN 'DateTime' 
      WHEN t.name IN ('decimal') THEN 'Decimal' 
      WHEN t.name IN ('bit') THEN 'Boolean' 
      ELSE 'Unknown' END 
+ ' ' + c.name + '{ get; set; }' FROM syscolumns as c 

JOIN systypes t ON t.xusertype=c.xusertype 
WHERE id IN (SELECT id FROM sysobjects WHERE [email protected]) 
union 
Select '}' 

它返回它想:

} 
public Boolean IsAdmin{ get; set; } 
public class obj_Users{ 
public Int32 UserCompanyID{ get; set; } 
public Int32 UserID{ get; set; } 
public Int32 UserRole{ get; set; } 
public String Email{ get; set; } 
public String FirstName{ get; set; } 
public String SessionKey{ get; set; } 
public String Surname{ get; set; } 
public String UserName{ get; set; } 
public String UserPassword{ get; set; } 

enter image description here

+8

沒有一個ORDER BY,對於沒有定義的順序結果行。 – 2014-12-01 19:21:18

+2

你是什麼意思「錯」?代碼中沒有任何類型的ORDERBY,所以不確定是什麼使任意一個命令「正確」。 – 2014-12-01 19:21:43

+0

此外,您正在嘗試解決之前已經解決了一百萬次的問題。你想要一個ORM的外觀。 – 2014-12-01 19:21:59

回答

0

嘗試排序方式colid。這有點給您的查詢的一個挑戰,但是這可能會工作:

select 'public class obj_' + @TableName + '{' 
union all 
(SELECT 'public '+ CASE WHEN t.name IN ('int', 'bigint') THEN 'Int32' 
      WHEN t.name IN ('nvarchar','varchar','text','ntext') THEN 'String' 
      WHEN t.name IN ('datetime','smalldatetime') THEN 'DateTime' 
      WHEN t.name IN ('decimal') THEN 'Decimal' 
      WHEN t.name IN ('bit') THEN 'Boolean' 
      ELSE 'Unknown' END 
+ ' ' + c.name + '{ get; set; }' FROM syscolumns as c 

JOIN systypes t 
    ON t.xusertype=c.xusertype 
WHERE id IN (SELECT id FROM sysobjects WHERE [email protected]) 
ORDER BY colid) 
union all 
Select '}' 

一個更強大的解決方案是使用子查詢:

select str 
from ((select -1 as ordering, 'public class obj_' + @TableName + '{' as str 
     union all 
     (SELECT colid, 
      'public '+ 
       (CASE WHEN t.name IN ('int', 'bigint') THEN 'Int32' 
        WHEN t.name IN ('nvarchar','varchar','text','ntext') THEN 'String' 
        WHEN t.name IN ('datetime','smalldatetime') THEN 'DateTime' 
        WHEN t.name IN ('decimal') THEN 'Decimal' 
        WHEN t.name IN ('bit') THEN 'Boolean' 
        ELSE 'Unknown' 
       END) + ' ' + c.name + '{ get; set; }' 
     FROM syscolumns c JOIN 
      systypes t 
      ON t.xusertype=c.xusertype 
     WHERE id IN (SELECT id FROM sysobjects WHERE name = @TableName) 
    ) union all 
     (Select 10000, '}') 
    ) 
ORDER BY ordering 
+0

嗨,戈登,謝謝你的幫助。 subqueuries更有意義,我想前進,但它似乎並不喜歡按順序部分'關鍵字'ORDER'附近的語法不正確。 – TMB87 2014-12-01 19:33:14

+0

我設法解決它,謝謝 – TMB87 2014-12-01 19:39:30