在SQL Server 2008上的Select语句中使用变量列名

时间:2011-10-07 13:18:37

标签: sql

我想使用列名AS A VARIABLE来从表中选择一个值。

例如

DECLARE @spalte as varchar(10) 
SET @spalte = 'Ecomp'

SELECT @spalte FROM dbo.MATDATA WHERE  2>= tmin AND 2<=tmax AND 1 = MatCode

当我尝试这样做时,我只回到'Ecomp',而不是预期值。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您正在查询表information_schema.columns,而不是表MATDATA。此外,您正在尝试查询列数据。 information_schema.columns仅包含有关列的元数据,而不包含这些列包含的数据。

相反,它看起来像你可能想要的那样:

SELECT *
FROM dbo.MATDATA
WHERE 2 >= tmin
    AND 2 <= tmax
    AND 1 = MatCode

答案 1 :(得分:1)

information_schema是描述数据库中对象的元数据 - 它不是您的表的占位符。

如果您只想从表中返回数据,那么

SELECT * FROM dbo.MATDATA WHERE 2 >= tmin AND 2<=tmax AND 1 = MatCode

如果要针对没有架构的表构建查询,则需要构建动态SQL查询,然后调用sp_executesql。

编辑:

仅选择一列:

SELECT EOComp FROM dbo.MATDATA WHERE 2 >= tmin AND 2<=tmax AND 1 = MatCode

编辑#2:

您更新的问题与原始Q没有多大相似之处,您已经接受了Redfilter的回答。

要选择动态列,您需要动态SQL。但是你不能从UDF调用procs,UDF应该返回标准类型(如果它的标量)或表。

以下是如何从SPROC执行此操作:

鉴于

create table dbo.MATDATA
(
    Column1 INT,
    Column2 NVARCHAR(100),
    Column3 DateTime,
    tmin int,
    tmax int,
    MatCode int
)

和PROC

create proc dbo.GetColumnFromMATDATA(@spalte nvarchar(256))
as
    begin
        set nocount on
        DECLARE @SQL NVARCHAR(MAX)
        SET @SQL = 'SELECT @spalte FROM dbo.MATDATA WHERE 2>= tmin AND 2<=tmax AND 1 = MatCode'
        exec sp_executesql @SQL, N'@spalte nvarchar(256)', @spalte=@spalte
    end

然后你可以做

exec dbo.GetColumnFromMATDATA 'Column1'
exec dbo.GetColumnFromMATDATA 'Column2'
exec dbo.GetColumnFromMATDATA 'Column3'
exec dbo.GetColumnFromMATDATA 'tmax'

但这一切都非常可怕,恕我直言。