问题描述
我的错误是在这部分(select min(sc.name) from so.name )
中,如何解决?
在选择中,我要获取表和列的名称,同时我想从表中获取列的最小值。那有可能吗?。
select so.name table_name,sc.name Column_name,(select min(sc.name) from so.name )
from sysindexes si,syscolumns sc,sysobjects so
where si.indid < 2 -- 0 = if a table. 1 = if a clustered index on an allpages-locked table. >1 = if a nonclustered index or a clustered index on a data-only-locked table.
and so.type = 'U' --U – user table
and sc.status & 128 = 128 --(value 128) – indicates an identity column.
and so.id = sc.id
and so.id = si.id
解决方法
因此,问题是您试图从根本上尝试执行动态代码,在该代码中,您尝试从系统表中基于表名选择列。 问题是SQL不知道您所引用的'so.name'是一个表(而且,sysobjects还包含过程和函数)。 与其相反,您应该基于object_id在sys.syscolumns和sys.systables之间进行内部联接。
,(对我来说)尚不清楚您的最终目标是什么,所以现在我将仅关注动态查询问题:
# build the `select/min()` query from the system table values ...
declare @query varchar(1000)
select @query = 'select min('+sc.name+') from '+so.name
from sysindexes si,syscolumns sc,sysobjects so
where si.indid < 2 -- 0 = if a table. 1 = if a clustered index on an allpages-locked table. >1 = if a nonclustered index or a clustered index on a data-only-locked table.
and so.type = 'U' -- U – user table
and sc.status & 128 = 128 -- (value 128) – indicates an identity column.
and so.id = sc.id
and so.id = si.id
# and then execute
execute(@query)
注意:请记住,按照编码,假设有一个带有标识列的多个表,@query
将包含几个select/min()
查询。对于大量查询,OP将需要a)扩展@query
的大小和/或b)可能使用基于游标的方法来动态构建和运行select/min()
查询。