从主查询中的子查询中选择列名称

时间:2015-08-11 12:48:22

标签: sql sql-server

我对SQL Server中的select有疑问。

首先,我从临时表中获取具有正确类型查询的列名称如下所示:

select 
    sc.name, st.name
from 
    tempdb.sys.columns sc
left join 
    sys.types st on sc.system_type_id = st.system_type_id
where 
    object_id = object_id('tempdb..#_tmpDocs')
    and st.name in ('char', 'varchar', 'nvarchar')

结果是一个列表,列出了我想要的类型,但是接下来我想在不同的查询中选择那些列,所以如果生病将上述查询的结果保存到名为#columns的临时表中,可以执行类似

 select (select * from #columns) from target_table

3 个答案:

答案 0 :(得分:1)

这是一个动态的SQL,可以满足您的需求:

    CREATE TABLE #_tmpDocs (id INT, x CHAR(10), y VARCHAR(100))

    DECLARE @cols NVARCHAR(1000)
    DECLARE @sql  NVARCHAR(1000)

    SELECT  @cols = COALESCE(@cols + ',', '') + QUOTENAME(SC.name)
    FROM    tempdb.sys.columns sc
            LEFT JOIN sys.types st ON sc.system_type_id = st.system_type_id
    WHERE   object_id = OBJECT_ID('tempdb..#_tmpDocs')
            AND st.name IN ( 'char', 'varchar', 'nvarchar' )

    SET @sql = 'select ' + @cols + ' from #_tmpDocs'

    PRINT @sql

    EXEC (@sql)

    EXEC sp_executesql @sql

根据您的需要在EXEC (@sql)EXEC sp_executesql @sql之间选择 - 请参阅here以了解每个人的行为。

答案 1 :(得分:0)

我不认为你可以在SQL中动态引用列。只是做一个纯粹的SQL版本,它将无法正常工作:

declare @x varchar(50) = 'MyColumn';
select @x from dbo.MyTable

您需要使用dynamic sql,并构建一个字符串:

declare @x nvarchar(50) = 'MyColumn';
declare @y nvarchar(250) = 'select ' + @x + ' from dbo.MyTable';

EXECUTE sp_executesql @y

因此,在您的情况下,您可能希望循环返回结果或以其他方式将其转换为可以连接到更大查询的列名称字符串(如上所述)。

答案 2 :(得分:0)

你试过这个吗?

SELECT *
FROM   tempdb.sys.columns
WHERE  object_id = object_id('tempdb..#columns');