2015-06-02 39 views
2

所以,我想弄清楚(如果可能的話)如何返回只有2列的結果集,這些列的行數與給定表中的列數成正比名稱,而不使用動態SQL函數:exec根據sys.columns中返回的值構建SELECT語句

Ex。我有表 'TBLA':

CREATE TABLE [dbo].[tblA](
[ColumnA] [varchar](20) NOT NULL, 
[ColumnB] [varchar](20) NOT NULL, 
[ColumnC] [varchar](20) NOT NULL 
) 

我甲肝TBLB

CREATE TABLE [dbo].[tblB](
[Column1] [varchar](20) NOT NULL, 
[Column2] [varchar](20) NOT NULL 
) 

我可以通過運行定位列:

SELECT c.name From sys.columns c inner join sys.tables t on c.object_id = t.object_id Where t.name = 'tablename' 

我最終還是想回2列,其的錶行數等於我查詢的表名中的列數。例如,

SELECT ColumnA, ColumnB, ColumnC FROM tblA WHERE ColumnA = ??? 

最終會被插入到表:

TABLE [dbo].[ResultTable](
[ColumnName] [varchar](max) NOT NULL, 
[ColumnValue] [varchar](max) NOT NULL 
) 

所以SP返回的外觀有點像:

---------------------------- 
| ColumnName | ColumnValue | 
---------------------------- 
| ColumnA | Hello  | 
---------------------------- 
| ColumnB | World  | 
---------------------------- 
| ColumnC | Fubar  | 
---------------------------- 

但使用TBLB會給你

---------------------------- 
| ColumnName | ColumnValue | 
---------------------------- 
| Column1 | ABCDE  | 
---------------------------- 
| Column2 | 12345  | 
---------------------------- 

如果tblA具有X c olumn,那麼返回的集合將有X行,但仍然是兩列。我知道這可以通過使用exec函數來完成,但不知道是否可以不使用它?

+0

這是什麼目的?如果你想使用'sys.columns'中的值,那麼你將不得不使用動態SQL來按列名選擇。 –

+0

@JohnOdom,目的是創建一個存儲過程,給定一個表名(例如'tblA','tblB',....,'tblN'),我可以做一個'SELECT n1,n2,.. ..來自tblN。我的問題是,我想嘗試創建一個足夠通用的sp,無論表名是什麼,它都會返回sys.tables中所有表的列。如果我在sp中包含函數'exec',那麼是不是會減慢sp? – Jason

+0

@Jason然後,再次,爲什麼你不使用'SELECT *'?,爲什麼你需要一個存儲過程呢? – Lamak

回答

1
SELECT ColumnName, ColumnValue 
FROM 
    (SELECT ColumnA, ColumnB, ColumnC FROM tblA) p 
UNPIVOT 
    (ColumnValue FOR ColumnName IN 
     ([ColumnA], [ColumnB], [ColumnC]) 
)AS unpvt; 
+0

我完全忘記了'UNPIVOT' +1。 –