2012-05-28 37 views
0

我想創建一個SELECT並從列中獲取信息及其值。我知道我需要訪問* information_schema *,然後我需要在特定行中使用* column_name *創建另一個SELECT來訪問該值。在SQL Server 2008中使用先前選定值的嵌套SELECT

SELECT column_name, 
    DATA_TYPE, 
    CHARACTER_MAXIMUM_LENGTH, 
    (? ... SELECT COLUMN_NAME FROM MYTABLE ... ?) 
FROM information_schema.columns 
WHERE table_name = 'MYTABLE' 
ORDER BY ordinal_position 

如何使用行中的列更改COLUMN_NAME以獲取結果?

+0

當目標表有多個記錄時,數據將如何顯示 –

+0

每列只有一條記錄 –

+0

只需使用中間件語言(例如,列)將列轉置爲行即可。 C#,PHP等)。雖然我認爲你的需求可以在Postgresql中完成,但它具有'array'類型和'unnest'功能 –

回答

2

如果表格中有多行,我不知道該如何操作。這將適用於有一行的表格。如果表中有多行,它將採用表中的一行。

SELECT I.COLUMN_NAME, 
     I.DATA_TYPE, 
     I.CHARACTER_MAXIMUM_LENGTH, 
     (
     SELECT T.X.value('/*[local-name(.)=sql:column("I.COLUMN_NAME")][1]', 'nvarchar(max)') 
     FROM 
     (
     SELECT * 
     FROM MyTable 
     FOR XML PATH(''), TYPE 
     ) AS T(X) 
     ) AS COLUMN_VALUE 
FROM INFORMATION_SCHEMA.COLUMNS AS I 
WHERE I.TABLE_NAME = 'MyTable' 
ORDER BY I.ORDINAL_POSITION 

SQL Fiddle

+0

+1哦,我,你是神 –

0

在你有興趣它是如何在PostgreSQL上做過任何情況下:http://www.sqlfiddle.com/#!1/dea17/1

create table beatles(firstname text,middlename text,lastname text, age int); 

insert into beatles(firstname,middlename,lastname,age) 
values('John','Winston','Lennon',40); 



select c.column_name, x.arr[c.ordinal_position] 
from information_schema.columns c 
cross join 
    (select avals (hstore(b)) as arr from (select * from beatles) as b ) as x 
where c.table_schema = 'public' and c.table_name = 'beatles' 
order by c.ordinal_position 

輸出:

| COLUMN_NAME |  ARR | 
------------------------- 
| firstname | John | 
| middlename | Winston | 
| lastname | Lennon | 
|   age |  40 | 

現場測試:http://www.sqlfiddle.com/#!1/dea17/1