【问题标题】:Use variable Column name in Select statement on SQL server 2008在 SQL Server 2008 上的 Select 语句中使用变量列名
【发布时间】:2011-10-07 13:18:37
【问题描述】:

我想使用列名作为变量从表中选择一个值!

例如

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

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

当我尝试这样做时,我只会得到“Ecomp”,而不是预期值。

有什么想法吗?

【问题讨论】:

  • 是的,但是 'tmin'、'tmax' 和 'MatCode' 不是表格的一部分 information_schema.columns

标签: sql


【解决方案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
)

和过程

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'

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

【讨论】:

  • 啊,抱歉,我忘记了最重要的部分:由于这是 UDF 的一部分,我不希望选择语句中的硬编码 Ecomp,而是像 @returncolumn 这样的变量。当我尝试只取回 requestet 列名时,而不是存储的值。
  • “但这一切都太可怕了” ;-) 我明白了。但是感谢您提供的非常好的“如何”。谢谢!
  • 很高兴您发现这很有用。只是不要告诉我的老板我是这样写 SQL 的;)
  • 这看起来很容易受到 SQL 注入攻击——这是存储过程不一定能抵御它们的一个例子。
  • @RedFilter - 已更新参数化 sp_executesql。很好发现。
【解决方案2】:

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

相反,您可能想要:

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

【讨论】:

  • 啊哈,我明白了。但我想从“Ecomp”列中的表 MATDATA 中选择一个值。
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 2012-08-30
  • 2010-11-02
  • 2016-12-18
  • 2013-10-30
  • 1970-01-01
  • 2013-04-07
  • 2013-06-14
相关资源
最近更新 更多