我试图通过了解要检索的列的标题名称来从表中撤回列。
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);
保存要从表中提取的列的字符串名称。
答案 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;