为什么下列语句只返回列名[tName]? 却不能返回列值

ThankU 2008-11-07 08:16:27
为什么下列语句只返回列名[tName]? 却不能返回列值:

select (select syscolumns.name from syscolumns where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName' ) from table1

这行语句的效果(我认为的)应该是等同于 select tName from table1,但是为什么下列语句只返回列名[tName]? 却不能返回列值呢?

可否返回列值?
...全文
109 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ThankU 2008-11-08
  • 打赏
  • 举报
回复
上面一样无法得到值,有什么办法可以做到呢?难啊!!!!加分!!
nalnait 2008-11-08
  • 打赏
  • 举报
回复
参考这个:

declare @sql nvarchar(1000)
set @sql='select (select quotename(syscolumns.name , '''') from syscolumns where syscolumns.id = object_id(''table1'')) from table1 where quotename(syscolumns.name , '''') = ''tName'''
exec (@sql)

ThankU 2008-11-08
  • 打赏
  • 举报
回复
即使是分开写,用geodetic的方法:

declare @colname varchar(50) 
select @colname=select syscolumns.name
from syscolumns
where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName'
exec('select '+@colname+ ' from table1')


也是抱错啊!提示‘Incorrect syntax near the keyword select’
ThankU 2008-11-08
  • 打赏
  • 举报
回复
Ok,先接贴了。问题没有解决,我重新发了一个完整的问题!
http://topic.csdn.net/u/20081108/20/03764b8d-7d7d-40eb-93ad-eaa90b028718.html
  • 打赏
  • 举报
回复
declare @s varchar(8000),@colname varchar(100)
select @colname=syscolumns.name from syscolumns where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName'
set @s='select '+@colname +' from table1'
exec(@s)
水族杰纶 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 ThankU 的回复:]
多谢水族杰綸,现在这个查询可以了,但是还剩下一个问题,就是 AND syscolumns.name = 'tName' 这里的tName是变量,我前天问了一个问题,也是您给出的解答:http://topic.csdn.net/u/20081106/01/bbcc8e92-4206-4d04-a59f-f96ac92aa180.html

您给的语句是:


SQL codeset nocount on
if object_id('tb') is not null drop table tb
go
create table tb(id int , bool1 varchar(10), bool2 varchar(10), bool3 varcha…
[/Quote]
这个booltrue是生成的别名,是不会在syscolumns中生成的
ThankU 2008-11-08
  • 打赏
  • 举报
回复
多谢水族杰綸,现在这个查询可以了,但是还剩下一个问题,就是 AND syscolumns.name = 'tName' 这里的tName是变量,我前天问了一个问题,也是您给出的解答:http://topic.csdn.net/u/20081106/01/bbcc8e92-4206-4d04-a59f-f96ac92aa180.html

您给的语句是:

set nocount on
if object_id('tb') is not null drop table tb
go
create table tb(id int , bool1 varchar(10), bool2 varchar(10), bool3 varchar(10))
insert tb select 1, 'true', 'false', 'false'
insert tb select 2, 'false', 'true', 'flase'
insert tb select 3, 'true', 'false', 'false'

declare @sql varchar(8000)
--set @sql='select * from ('
select @sql = isnull(@sql + ' union all ' , '' ) + ' select id , [booltrue] = case when ' + quotename(Name , '') + '=''true'' then'+quotename(Name , '''')+ ' end from tb '
from syscolumns
where name!=N'ID' and id=object_id('tb')
order by colid asc
set @sql='select * from (' +@sql +') t where booltrue is not null'
exec(@sql + ' order by id ')
/*id booltrue
----------- --------
1 bool1
2 bool2
3 bool1
*/



现在这个tName其实就是booltrue,我想把这两个查询连接起来,也就是说:怎样在 AND syscolumns.name = 'tName' 这条语句把tName换成booltrue列的值?

谢谢!
nalnait 2008-11-08
  • 打赏
  • 举报
回复
你的另一贴有回这个:
你看不行还是怎么了?

declare @sql varchar(max)
set @sql='select quotename(syscolumns.name , '''') from syscolumns where syscolumns.id = object_id(''table1'')'
exec (@sql)
水族杰纶 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ljhcy99 的回复:]
select (select syscolumns.name from syscolumns where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName' ) from table1


带颜色的这个子查询只返回 name 的集合。
[/Quote]
--更正
--引入中间变量
declare @colname varchar(50)
select @colname= syscolumns.name
from syscolumns
where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName'
exec('select '+@colname+ ' from table1')
ljhcy99 2008-11-08
  • 打赏
  • 举报
回复
select (select syscolumns.name from syscolumns where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName' ) from table1


带颜色的这个子查询只返回 name 的集合。
ThankU 2008-11-08
  • 打赏
  • 举报
回复
Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'select'.
水族杰纶 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ThankU 的回复:]
这个只能返回列名,难道SQL没有办法根据列名返回列值么?
[/Quote]
--引入中间变量
declare @colname varchar(50)
select @colname=select syscolumns.name
from syscolumns
where syscolumns.id = object_id('table1') AND syscolumns.name = 'tName'
exec('select '+@colname+ ' from table1')
ThankU 2008-11-08
  • 打赏
  • 举报
回复
这个只能返回列名,难道SQL没有办法根据列名返回列值么?
nalnait 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ThankU 的回复:]
其实where quotename(syscolumns.name , '''') = ''tName''' 这里的tName是另一个表里table2的值,这些值用来指明table1中的列。

比如 Table2:

tId, tName
1, zhao
2, qian
3, sun
...

Table1:
tId,zhao, qian, sun...
1, a, b, c
2, d, e, f


我想查找的结果是:
tId,value
1, a
2, e

所以用到:

declare @sql nvarchar(1000)
set @sql='select (select quotename(sysco…
[/Quote]

因为查询出来的是字符: 比如 select 'a,b' from tablename 你看看输出什么

用EXEC ()执行就可以了
fcuandy 2008-11-07
  • 打赏
  • 举报
回复
看到你的数据,有点印像,昨天回过吧

不用动态语句的话:
参考
http://topic.csdn.net/u/20081107/17/68aaf5a9-c596-4ab5-ae18-f3370b2ab35b.html
倒数第二,第三个例子。
fcuandy 2008-11-07
  • 打赏
  • 举报
回复
select syscolumns.name from

这里产生的tname是字串值,它是字段的名字,这里是值,不是sql列对象。

所以这样是不行的。

ThankU 2008-11-07
  • 打赏
  • 举报
回复
其实where quotename(syscolumns.name , '''') = ''tName''' 这里的tName是另一个表里table2的值,这些值用来指明table1中的列。

比如 Table2:

tId, tName
1, zhao
2, qian
3, sun
...

Table1:
tId,zhao, qian, sun...
1, a, b, c
2, d, e, f


我想查找的结果是:
tId,value
1, a
2, e

所以用到:

declare @sql nvarchar(1000)
set @sql='select (select quotename(syscolumns.name , '''') from syscolumns where syscolumns.id = object_id(''table1'')) from table1 where quotename(syscolumns.name , '''') = ''tName'''
exec (@sql)

我发现其他方法不可以因为table2是动态的,是查询结果,不是一个简单的表。
fcuandy 2008-11-07
  • 打赏
  • 举报
回复
你既然是从syscolumns里提出了所有列名出来,那直接 select * 就是了,有什么必要这样 ?
水族杰纶 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ThankU 的回复:]
上面提示‘Incorrect syntax near the keyword select’

真的没有办法写在一起了么?谢谢!
[/Quote]
有必要吗?你要做什么?
ThankU 2008-11-07
  • 打赏
  • 举报
回复
上面提示‘Incorrect syntax near the keyword select’

真的没有办法写在一起了么?谢谢!
加载更多回复(6)

22,199

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧