SQL Server:从字符串标题获取列数据

时间:2018-07-22 15:14:34

标签: sql-server tsql

我试图通过了解要检索的列的标题名称来从表中撤回列。

select @sName
from VPDW.dbo.Fact_Email_MW100
where VesselID = 3763 
  and (cast(UTClogTime as date) >= cast(DateAdd(day, -1, GETUTCDATE()) as date))

其中

Declare @sName nvarchar(max);

保存要从表中提取的列的字符串名称。

2 个答案:

答案 0 :(得分:3)

整个查询必须是动态的,以实现您要执行的操作。也就是说,您必须先构建SQL,然后执行它。考虑类似以下内容(未经测试):

declare @sName nvarchar(max)
declare @sql nvarchar(max)

set @sName = 'some_column'

set @sql = 'select ' + @sName + ' from VPDW.dbo.Fact_Email_MW100 where VesselID = 3763 and (cast(UTClogTime as date) >= cast(DateAdd(day,-1,GETUTCDATE()) as date))'
print @sql

exec sp_sqlexec  @sql

答案 1 :(得分:1)

有时不能使用动态SQL(在VIEW中是iTVF)。在这种情况下,您可以使用XML的功能来处理通用查询:

DECLARE @ColName VARCHAR(100)='name';

SELECT
(
    SELECT TOP 1 * 
    FROM sys.objects
    FOR XML PATH('row'),TYPE
).value('(/row/*[local-name()=sql:variable("@ColName")]/text())[1]','nvarchar(max)') AS ValueAtColumnName;

这将获得sys.objects的一行,并返回列name的值。

对于您的查询,它看起来像

Declare @sName nvarchar(max);
SELECT
(
    select *
    from VPDW.dbo.Fact_Email_MW100
    where VesselID = 3763 
      and (cast(UTClogTime as date) >= cast(DateAdd(day, -1, GETUTCDATE()) as date))

).value('(/row/*[local-name()=sql:variable("@sName")]/text())[1]','nvarchar(max)') AS ValueAtColumnName;