简体   繁体   English

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

[英]Select columns name from subquery in main query

I have a question about select in SQL Server. 我有一个关于在SQL Server中选择的问题。

First I'm getting columns name from temp table with proper type query looks like this: 首先,我从临时表中获取具有正确类型查询的列名称,如下所示:

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')

Result is a list of columns with type I want, but next I want to select those columns in different query so if ill save result from above query into temp table with name #columns with it be possible to do something like 结果是我想要的类型的列的列表,但是接下来我想在不同的查询中选择那些列,因此如果生病将上述查询的结果保存到名称为#columns的临时表中,则可以执行以下操作

 select (select * from #columns) from target_table

Here's a dynamic sql that will do what you need: 这是一个动态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

Chose between EXEC (@sql) and EXEC sp_executesql @sql based on you needs - see here to get an idea of what each is doing. 根据需要在EXEC (@sql)EXEC sp_executesql @sql之间进行选择-请参见此处以了解它们的作用。

I don't think you can reference columns dynamically in SQL like that. 我认为您不能像这样在SQL中动态引用列。 Just doing a pure sql version, it won't work: 仅执行纯sql版本,将无法正常工作:

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

You'll need to use dynamic sql , and build a string: 您将需要使用动态sql ,并构建一个字符串:

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

EXECUTE sp_executesql @y

So in your case you may want to loop through your return result or otherwise turn it into a string of column names that can be concatenated to a larger query (like above). 因此,在您的情况下,您可能需要遍历返回的结果,或者将其转换为可以连接到较大查询(如上)的列名字符串。

Did you try this? 你有尝试过吗?

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM