zjcxc(邹建) 大哥及各位高手请进 如果得到表中的字段名称 问题

goody9807 2004-12-30 09:19:20
--测试数据
create table 表(col1 int,col2 int,col3 int,col4 int)
insert 表 select 1,2,2,1
--union all select 2,2,2,2
--union all select 2,2,2,1
go

--或者:

create proc p_qry
@tbname sysname, --要查的表名
@re nvarchar(4000) out
as
set nocount on
declare @s nvarchar(4000)
set @s=''
select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
from syscolumns where id=object_id(@tbname)
select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+'] set @s=stuff(@s,1,1,'''')'
exec sp_executesql @s,N'@s nvarchar(4000) out',@re out
go

--调用
declare @re nvarchar(4000)
exec p_qry '表',@re out --上面的调用少了表名
select 结果=@re
go

--删除测试
drop table 表
drop proc p_qry

/*--测试结果

结果
---------------------
col2,col3

(所影响的行数为 1 行)
--*/

===========================
以上是您给我做的 我有些不明白
您的思路 是先把 表中的字段名取出来

1。select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
~~~~
不太明白 您是用单引号还是双引号??


exec sp_executesql @s,N'@s nvarchar(4000) out',@re out
N‘ 是什么意思


不好意思 由于基础很差 请多包涵 谢谢!
...全文
254 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2004-12-30
  • 打赏
  • 举报
回复
declare @s varchar(100)
set @s='as_dfa_dfa_daf'
select [_个数]=len(@s)-len(replace(@s,'_',''))
goody9807 2004-12-30
  • 打赏
  • 举报
回复
谢谢 zjcxc(邹建)大哥

应该是的

我想甩选一下

有没有判断 一个字符串中 "_" 字符的个数的函数
zjcxc 元老 2004-12-30
  • 打赏
  • 举报
回复
select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
from syscolumns
where id=object_id(@tbname)
and name like 'xx%' --加上对字段名的过滤条件

后,print(@s) 看看,就知道是否字段太多
goody9807 2004-12-30
  • 打赏
  • 举报
回复
我测试了一下 好像是由于字段太多了的原因
goody9807 2004-12-30
  • 打赏
  • 举报
回复
有的表可以 有个报错

Server: Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string ',BAB0336_2_5_2_8_2_3'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ',BAB0336_2_5_2_8_2_3'.
goody9807 2004-12-30
  • 打赏
  • 举报
回复
我试了

and name like 'xx%' --加上对字段名的过滤条件
好像不起作用

好像和我的字段名有关

例如 BAB0336_2_27 中间有下划线
artoksxb 2004-12-30
  • 打赏
  • 举报
回复
''''等价于char(39)
artoksxb 2004-12-30
  • 打赏
  • 举报
回复
exec sp_executesql @s,N'@s nvarchar(4000) out',@re out

解释:动态执行@s字符串语句,然后把@S变量字符串输出到@re变量中。从而可以用select @re来查看
zjcxc 元老 2004-12-30
  • 打赏
  • 举报
回复
select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
from syscolumns
where id=object_id(@tbname)
and name like 'xx%' --加上对字段名的过滤条件
goody9807 2004-12-30
  • 打赏
  • 举报
回复
我现在加上 N'表' 就可以了

但是怎么用其他的表不行

有个TS字段 时间戳 还多了个主建
zjcxc 元老 2004-12-30
  • 打赏
  • 举报
回复
跟楼主的测试环境有关,他的测试环境应该是和SQL服务器环境不一样
所以
exec p_qry '表',@re out
传递给存储过程的表名是乱码
vinsonshen 2004-12-30
  • 打赏
  • 举报
回复
存储过程改成这样:

alter proc p_qry
@tbname sysname, --要查的表名
@re nvarchar(4000) out
as
set nocount on
declare @s nvarchar(4000)
set @s=''
select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
from syscolumns where id=object_id(@tbname)
select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+'] set @s=stuff(@s,1,1,'''')'
exec sp_executesql @s,N'@s nvarchar(4000) out',@s out --输出为@S
set @re=@s --要将输出@s赋给输出变量@re
go
goody9807 2004-12-30
  • 打赏
  • 举报
回复
我的表结构

表名 B_NeonatalDefectsNervous

不同于 测试表的是
有个
TS字段 是不是影响啊

还有个主建

vinsonshen 2004-12-30
  • 打赏
  • 举报
回复
我照你上面的测试了,不是null喔:


结果
---------
col2,col3

(所影响的行数为 1 行)
goody9807 2004-12-30
  • 打赏
  • 举报
回复
哈哈 我找到原因了

exec p_qry '表',@re out

应该加上 N'表' 因为它是 Unicode


========

但是 我试了别的表就不行了 我把表名改为 我们数据库中的表名



Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'when'.
rfq 2004-12-30
  • 打赏
  • 举报
回复
学习
goody9807 2004-12-30
  • 打赏
  • 举报
回复
好的

1。先建一个表
create table 表(col1 int,col2 int,col3 int,col4 int)
insert 表 select 1,2,2,1
这个是把代码拷贝到查询分析器中 然后建立的

2。建立存储过程

create proc p_qry
@tbname sysname, --要查的表名
@re nvarchar(4000) out
as
set nocount on
declare @s nvarchar(4000)
set @s=''
select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
from syscolumns where id=object_id(@tbname)
select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+'] set @s=stuff(@s,1,1,'''')'
exec sp_executesql @s,N'@s nvarchar(4000) out',@re out
go

拷贝到查询分析器

3。把如下语句拷贝到查询分析器

declare @re nvarchar(4000)
exec p_qry '表',@re out --上面的调用少了表名
select 结果=@re
go

============
结果
NUll

zjcxc 元老 2004-12-30
  • 打赏
  • 举报
回复
不行的话你把表结构脚本,表中的数据,你修改后的处理过程帖上来做测试
zjcxc 元老 2004-12-30
  • 打赏
  • 举报
回复
你可以装个中文的帮助嘛(E文不好别太勉强)

SQL2000联机帮助
http://www.microsoft.com/downloads/details.aspx?FamilyID=a6f79cb1-a420-445f-8a4b-bd77a7da194b&DisplayLang=zh-cn
goody9807 2004-12-30
  • 打赏
  • 举报
回复
楼主最主要的问题是懒,不是笨

stuff,sp_executesql在联机帮助上都有详细说明,要学会查帮助
==============
zjcxc(邹建)
您冤枉我了
我已经看了联机帮助 都已经查到 由于是E文的 所以看了个大概

由于项目很紧啊 没有时间允许我把帮助看一遍 我也想多学点东西啊

这个东西要求今天弄完 我把您给我的放在查询分析器中执行了 但是结果的确为空

我真的试了好几次啊!

也许我真的好笨啊!
加载更多回复(18)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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