2017-04-26 82 views
1

我需要一個select查詢,它返回某些列的值。 我想要的列以'U_S'開頭。SQL - 子查詢(列名)

Select * from em 

我需要轉換上面的查詢。在「*」必須是結果(而用逗號):

select COLUMN_NAME from information_schema.columns 
where table_name='em' and column_name like 'u_s%' 
+0

你試圖讓與數據庫中的所有表'U_S'開頭的所有列名? – Joby

+0

您必須動態生成SQL,然後使用[sp_executesql]執行該命令(https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact- SQL)在存儲過程中。你可以在下面使用@ johncappelletti的出色答案來讓你的字段列表逗號分開。 – JNevill

+3

爲什麼你不知道你的表包含哪些列?這聽起來像一個非常糟糕的數據庫設計。 –

回答

3

有這樣的例子不勝枚舉,但我明白,有時候我們都需要一點點踢啓動。

Select Stuff((Select ',' +quotename(Column_Name) 
    From information_schema.columns 
    Where table_name='em' and column_name like 'u_s%' 
    For XML Path ('')),1,1,'') 
+0

它像預期的那樣返回數據。但是我不能在另一個查詢中使用它。喜歡:從@ 012選擇@mytemp –

+0

@HugoNunes如果那是你的意圖,你將不得不去動態化 –

0
select CAST(
    (select COLUMN_NAME + ',' 
    from information_schema.columns 
    where table_name='em' and column_name like 'u_s%' 
    for xml path('') 
    ) as nvarchar(max) 
) 

,你將不得不刪除最後一個逗號......

0

您也可以直接選擇列名到一個變量,然後可以使用動態SQL。

declare @Cols varchar(max) = null; 

select @Cols = concat(@Cols +', ',quotename(COLUMN_NAME)) 
from information_schema.columns 
where table_name='em' and column_name like 'u_s%' 
order by column_name; 

--select @Cols as Cols; 
declare @SQL varchar(max); 
set @SQL = 'select '+ @Cols +' from em'; 
exec(@SQL); 

@Cols最初爲null,null +','爲null。
所以結果不會以逗號開頭。

quotename函數僅作爲安全措施添加。
以防萬一列名有時在名稱中有空格。

1

可以使用代碼象下面這樣:

declare @col varchar(500) 
select @col=Stuff((Select ',' +quotename(Column_Name) 
    From information_schema.columns 
    Where table_name='em' and column_name like 'u_s%' 
    For XML Path ('')),1,1,'') 
exec('select '[email protected] 
    +' from em')