2017-04-26 40 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')