注册 登录
编程论坛 SQL Server论坛

大家看一下,这个 SQL 语句怎么修改!

liudetao 发布于 2014-11-03 17:27, 2034 次点击
select tablename from mpdb_fldinf where fldname='地籍号'

select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1

下面语句中的MA33是数据库中的一个表,但这个表有时会发生变化,不固定,我想用上面的条件语句求得,如何将上面的语句合并到下面的语句之中,形成一条完整的语句!!!

我自己整成这样:select 地籍号1 from (select tablename from mpdb_fldinf where fldname='地籍号') where 地籍号1 like'660610%' ORDER BY 地籍号1

但执行时,出错!!



[ 本帖最后由 liudetao 于 2014-11-3 17:32 编辑 ]
30 回复
#2
liudetao2014-11-04 21:43
这个问题没有人知晓吗?!
#3
厨师王德榜2014-11-05 11:35
如果这个表的名字时常发生变化,不妨用变量来装这个表名,再 用一个字符串变量来组合你的语句,代码就不写了,这个不难的.
#4
liudetao2014-11-05 13:18
其实这个变化的表用这个语句可以求得,select tablename from mpdb_fldinf where fldname='地籍号'
 但我不知道如何将这段代码放在下面的语句里,组成完整的语句,请大侠指点!!
#5
tanxiaobin2014-11-05 21:39
执行下面的看看行不行?我觉得应该可以。。。

select 地籍号1 from (select tablename from mpdb_fldinf where fldname='地籍号')a where 地籍号1 like'660610%' ORDER BY 地籍号1
#6
tlliqi2014-11-06 07:44
以下是引用tanxiaobin在2014-11-5 21:39:52的发言:

执行下面的看看行不行?我觉得应该可以。。。
 
select 地籍号1 from (select tablename from mpdb_fldinf where fldname='地籍号')a where 地籍号1 like'660610%' ORDER BY 地籍号1
应该能行
#7
liudetao2014-11-06 12:37
执行后,提示如下错误:
消息 207,级别 16,状态 1,第 2 行
列名 '地籍号1' 无效。
消息 207,级别 16,状态 1,第 2 行
列名 '地籍号1' 无效。
#8
liudetao2014-11-06 13:47
真的不能执行,大侠们再帮研究一下!
#9
tanxiaobin2014-11-06 14:17
oo。。。是漏了点东西,再试试


select 地籍号1 from (select tablename as 地籍号1 from mpdb_fldinf where fldname='地籍号')a where 地籍号1 like'660610%' ORDER BY 地籍号1
#10
liudetao2014-11-06 14:53
回复 9 楼 tanxiaobin
这样倒是不出错误了,但是查询到的东西是空的!!1
#11
tanxiaobin2014-11-06 15:37
回复 10 楼 liudetao
那只能说明你的(select tablename from mpdb_fldinf where fldname='地籍号')要不就是空表,要不就是里面没有以660610%开头的数据
#12
liudetao2014-11-06 17:09
回复 11 楼 tanxiaobin
这个语句没有问题,我单独查询时,结果是MA33,这个是一个表格!
(select tablename from mpdb_fldinf where fldname='地籍号')这句代码就是为了求出这个表格,这个表格在SQL中是有的,但每次不回定,但这个语句就可以准确的求出(select tablename from mpdb_fldinf where fldname='地籍号')!


其实我的意思是,利用这个语句(select tablename from mpdb_fldinf where fldname='地籍号')得出一个表,如表的名字叫MA33,而且这个表在数据库是存在的,然后再利用后面的语句select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1 从这个MA33表格查询相应的结果!!我是这个意思,可能是我前面没有把意思表达清楚!!







[ 本帖最后由 liudetao 于 2014-11-6 17:42 编辑 ]
#13
tlliqi2014-11-06 17:47
以下是引用tanxiaobin在2014-11-6 14:17:01的发言:

oo。。。是漏了点东西,再试试
 
 
select 地籍号1 from (select tablename as 地籍号1 from mpdb_fldinf where fldname='地籍号')a where 地籍号1 like'660610%' ORDER BY 地籍号1
select 地籍号1 from (select tablename as 地籍号1 from mpdb_fldinf where fldname='地籍号')a where 地籍号1 like '660610%' ORDER BY 地籍号1
like后应有一个空格
#14
tlliqi2014-11-06 17:49
回复 12 楼 liudetao
上传少量数据 帮你试试
#15
liudetao2014-11-06 18:04
回复 14 楼 tlliqi
[attach]77822[/attach]

按顺序,1、2、3,来看,你就会明白了!

[ 本帖最后由 liudetao 于 2014-11-6 18:06 编辑 ]
#16
tanxiaobin2014-11-06 19:58
以下是引用liudetao在2014-11-6 17:09:21的发言:

这个语句没有问题,我单独查询时,结果是MA33,这个是一个表格!
(select tablename from mpdb_fldinf where fldname='地籍号')这句代码就是为了求出这个表格,这个表格在SQL中是有的,但每次不回定,但这个语句就可以准确的求出(select tablename from mpdb_fldinf where fldname='地籍号')!


其实我的意思是,利用这个语句(select tablename from mpdb_fldinf where fldname='地籍号')得出一个表,如表的名字叫MA33,而且这个表在数据库是存在的,然后再利用后面的语句select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1 从这个MA33表格查询相应的结果!!我是这个意思,可能是我前面没有把意思表达清楚!!


你这个(select tablename from mpdb_fldinf where fldname='地籍号')其实很奇怪,得出来的只是一张只有一个字段叫tablename的表。。。是不是,你确定你想筛选出来的地籍号就在tablename这个字段的内容里面?是不是你没把你要的字段从mpdb_fldinf里面选出来,很少看到有人特地先去生成一张只有一个字段的临时表的,是不是搞错了?。。。。。与其这样你还不如别去生成什么临时表了,直接用下面的语句

select tablename from mpdb_fldinf where fldname='地籍号' and tablename like'660610%' ORDER BY tablename

结果都是一样的,干嘛特定做一张只有一个字段的临时表然后再从里面筛选呢?
#17
tanxiaobin2014-11-06 20:05
我觉得你是不是以为(select tablename from mpdb_fldinf)的意思是从mpdb_fldinf的库里面把一张叫tablename的表里面的所有内容展现出来吧。。。晕死。。
#18
liudetao2014-11-06 23:57
哎我都不知道怎么去表达了,这是我的联系方式,电话:15099150110,你拨一下,我回给你,我想我会说清楚的!
#19
tlliqi2014-11-07 13:44
以下是引用tanxiaobin在2014-11-6 19:58:08的发言:

 
 
你这个(select tablename from mpdb_fldinf where fldname='地籍号')其实很奇怪,得出来的只是一张只有一个字段叫tablename的表。。。是不是,你确定你想筛选出来的地籍号就在tablename这个字段的内容里面?是不是你没把你要的字段从mpdb_fldinf里面选出来,很少看到有人特地先去生成一张只有一个字段的临时表的,是不是搞错了?。。。。。与其这样你还不如别去生成什么临时表了,直接用下面的语句
 
select tablename from mpdb_fldinf where fldname='地籍号' and tablename like'660610%' ORDER BY tablename
 
结果都是一样的,干嘛特定做一张只有一个字段的临时表然后再从里面筛选呢?
说的有道理
#20
liudetao2014-11-07 13:57
回复 17 楼 tanxiaobin

其实我的意思是这样的,我想根据这个语句select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1,检索出满足相应条件的地籍号1字段中的数据,这个执行时也是正确的,没有问题!!!

那为什么还要加上这句代码呢?select tablename from mpdb_fldinf where fldname='特别',是这样的,前面语句中的MA33,是一个表,而且实际存在,但这个表我们信息系统每次生成的名字都不一样,这次是MA33,下次可能是MA68,名字不固定,但数据结构都是一样,而且都有数据,那我每次检索出满足相应条件的地籍号1字段中的数据时,都要去修改语句中的MA33,很麻烦!但这个不固定名字的表,它的名称在后面语句中的mpdb_fldinf表中的tablename字段中存在,只要满足where fldname='特别'这个条件,就可查询出这个表名!!这样的话,我就不用每次都去修改这个语句select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1中的MA33表名了!!!

[ 本帖最后由 liudetao 于 2014-11-7 14:05 编辑 ]
#21
liudetao2014-11-07 14:00
回复 19 楼 tlliqi
其实我的意思是这样的,我想根据这个语句select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1,检索出满足相应条件的地籍号1字段中的数据,这个执行时也是正确的,没有问题!!!
 
那为什么还要加上这句代码呢?select tablename from mpdb_fldinf where fldname='特别',是这样的,前面语句中的MA33,是一个表,而且实际存在,但这个表我们信息系统每次生成的名字都不一样,这次是MA33,下次可能是MA68,名字不固定,但数据结构都是一样,而且都有数据,那我每次检索出满足相应条件的地籍号1字段中的数据时,都要去修改语句中的MA33,很麻烦!但这个不固定名字的表,它的名称在后面语句中的mpdb_fldinf表中的tablename字段中存在,只要满足where fldname='特别'这个条件,就可查询出这个表名!! 这样的话,我就不用每次都去修改这个语句select 地籍号1 from MA33 where 地籍号1 like'660610%' ORDER BY 地籍号1中的MA33表名了!!!

[ 本帖最后由 liudetao 于 2014-11-7 14:07 编辑 ]
#22
tlliqi2014-11-07 14:30
概念要弄清,表内容和表名、字段名和表名
你的问题我看明白了 你说的也明白 其实你是想用变量来提供表名
****************
select tablename from mpdb_fldinf where fldname='特别'----------这个tablename其实就是你想要的表名,
select 地籍号1 from (select tablename from mpdb_fldinf where fldname='特别') where 地籍号1 like'660610%' ORDER BY 地籍号1----你想想这括号中的是一个表名吗?
建议:把括号中的字段存入变量,即:变量=tablename
select 地籍号1 from 变量 where 地籍号1 like'660610%' ORDER BY 地籍号1

这样符合你想要的了,不是吗?
#23
liudetao2014-11-07 14:42
回复 22 楼 tlliqi
谢谢,太感谢了!!
#24
liudetao2014-11-07 15:24
回复 22 楼 tlliqi
唉,试了赋变量,可还是不行,大侠帮帮忙,写的细些,谢谢了!!1
#25
tanxiaobin2014-11-07 16:08
declare @tablename varchar(500),@sql varchar(5000)

select @tablename=tablename from mpdb_fldinf where fldname='特别'

set @sql='select 地籍号1 from '+@tablename+' where 地籍号1 like''660610%'' ORDER BY 地籍号1'

exec (@sql)

你试试看行不行?
#26
liudetao2014-11-07 16:13
回复 25 楼 tanxiaobin
可以,输出结果是正确的,谢谢!
#27
tanxiaobin2014-11-07 16:14
不过你要确保你的MA33和mpdb_fldinf这两张表要在同一个库里面
#28
liudetao2014-11-07 16:38
回复 25 楼 tanxiaobin
朋友,这些语句放在EXCEL的VBA中代码应该如何修改呢?

我的VBA是这样的:
Sub GetData1()
     
     
     Dim server As String
     Dim strDatabase As String
     Dim user As String
     Dim pwd As String
     Dim djhcx As String

     server = Cells(3, 8).Value
     strDatabase = Cells(4, 8).Value
     user = Cells(5, 8).Value
     pwd = Cells(6, 8).Value
     djhcx = Cells(7, 8).Value
   
     Dim conn0
     Set conn0 = CreateObject("ADODB.Connection")
     conn0.Open ("driver={SQL Server};server=" & server & ";uid=" & user & ";pwd=" & pwd & ";database=" & strDatabase & ";")
     sql0 = "select 地籍号1 from MA33 where 地籍号1 like'" & djhcx & "%' ORDER BY 地籍号1"
     sql00 = "select count(*) as 记录数 from MA33 where 地籍号1 like'" & djhcx & "%'"
     Dim ds0
     Set ds0 = CreateObject("ADODB.Recordset")
     With ds0
         .Open sql0, conn0
         Range("a2:a65536").ClearContents
         Range("a1").Offset(1, 0).CopyFromRecordset ds0
     End With
     Set ds0 = Nothing
     
     Dim ds00
     Set ds00 = CreateObject("ADODB.Recordset")
     With ds00
         .Open sql00, conn0
         MsgBox "从EXCEL第二行格开始,根据数据查询条件" & djhcx & ",共从苍穹图形库" & strDatabase & "中读取" & ds00("记录数") & "条数据记录更新到EXCEL的A列(图形地籍号)之中!", 16, "A列(图形地籍号)数据更新"
     End With
     Set ds00 = Nothing
     
     conn0.Close
     Set conn0 = Nothing
     
     MsgBox "此次数据更新完成!", 16, "温馨提示"
  
        
     Exit Sub
   
  
End Sub



[ 本帖最后由 liudetao 于 2014-11-7 17:09 编辑 ]
#29
mxbing19842014-11-08 08:34
1.拼SQL
Declare @Table Varchar(100)
Select @Table=tablename as 地籍号1 from mpdb_fldinf where fldname='地籍号'
Exec ('select 地籍号1 from '+@Table+ ' where 地籍号1 like'660610%' ORDER BY 地籍号1')

2.用存储过程
Exec sp_msforeachtable @command1="select 地籍号1 from ? where 地籍号1 like'660610%' ORDER BY 地籍号1",@WhereAnd=" And o.name in (Select tablename from mpdb_fldinf where fldname='地籍号')"
#30
liudetao2014-11-08 09:15
回复 29 楼 mxbing1984
朋友,拼SQL如何弄,再详细些提示,谢谢!     
我这样拼了一下,可是提示“:冒号附近存在语句错误!”
sql0 = "Declare @Table Varchar(100):Select @Table=tablename from tx.mpdb_fldinf where fldname='地籍号':Exec ('select 地籍号1 from '+@Table+ ' where 地籍号1 like''660610%'' ORDER BY 地籍号1')"



[ 本帖最后由 liudetao 于 2014-11-8 12:08 编辑 ]
#31
happypy2014-11-29 15:26
将表名赋值到变量中,变量作为表名,要使用 动态 SQL 来处理
也就是把整个 SQL 语句,存储为一个 varchar / nvarchar 的字符串来处理
declare @tbName varchar(20)
set @tbName=‘select tablename from mpdb_fldinf where fldname='地籍号'
declare @sql varchar(200)
set @sql='select 地籍号1 from ' +@tbName +'where 地籍号1 like'660610%' ORDER BY 地籍号1'
exec(@sql)
1