我想使用列名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',而不是预期值。
有什么想法吗?
答案 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'
等
但这一切都非常可怕,恕我直言。