首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何遍历字段名称 [已结贴,结贴人:fongzl]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 13:59:39 楼主
    数据表中某些字段含有全角字符,我想遍历各字段,把全角字符全部改成半角
    现在不知道如何逐一获取字段名称
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 14:05:011楼 得分:0
    SQL code
    SELECT * FROM Syscolumns WHERE ID=OBJECT_ID('表名')
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 14:26:302楼 得分:0
    agree
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ojuju10
    • 等级:
    发表于:2008-06-01 14:36:053楼 得分:0

    select a.name from syscolumns a,sysobjects b
    where a.id=b.id and b.xtype='u'
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 14:49:464楼 得分:0
    这是一次选择了所有列
    怎么得到其中的一列呢

    以前没有在sql server中写过程序
    这个问题可能幼稚了点
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 15:49:065楼 得分:0
    以前没搞过,用界面手工一个个改吧,这牵涉到很广的问题:游标、改名、动态SQL、排序规则,不是三言两语可以教会你的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 15:52:196楼 得分:0
    企业管理器里面,选中一个表,右键/设计表,见到全角的字段名就改,改完关闭,保存对表的更改。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 16:11:107楼 得分:5
    用游标可以逐一得到字段名称的
    declare @columnsname varchar(30)

    declare getcolumnsname cursor for
    select a.name from syscolumns a,sysobjects b
    where a.id=b.id and b.xtype='u' and a.id='表名'

    open getcolumnsname

    fetch next from getcolumnsname into @columnsname

    while @@fetch_status=0
    begin

    -- 字段名称的修改操作,全角字符全部改成半角不会,等待高手指点
    -- alter table 表名 modify 全角 半角

    fetch next from getcolumnsname into @columnsname
    end

    close getcolumnsname
    deallocate getcolumnsname
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 16:13:108楼 得分:5
    遍历各字段,具体代码如下:

    declare @temp varchar(20)
    declare @lasttemp varchar(20)
    declare mycursor CURSOR
    global
    scroll
    dynamic
    read_only
    for
    select sys.columns.name from sys.columns,sys.objects where  sys.columns.object_id=sys.objects.object_id and sys.objects.name='course'

    open mycursor

    fetch first from mycursor into @temp
    print @temp
    set @lasttemp=@temp
    while(@@fetch_status=0)
    begin
    fetch next from mycursor into  @temp
    if(@lasttemp!=@temp)
    print @temp
    set @lasttemp=@temp
    end

    close mycursor
    deallocate mycursor
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 16:54:089楼 得分:0
    引用 6 楼 Limpire 的回复:
    企业管理器里面,选中一个表,右键/设计表,见到全角的字段名就改,改完关闭,保存对表的更改。


    我用的是2005,右键没有设计表,只有修改,其中没找到全角半角的设置
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 16:58:2610楼 得分:0
    7楼和8楼的代码还没看明白,一会仔细看

    有个问题需要说一下,我不能把字段改成半角,改了之后软件中就不能导入全角字符,是不是?
    我的软件需要接收别人报送的数据,应该兼容全角
    现在只是想把所有全角字符改成半角
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 17:01:1011楼 得分:0
    SQL code
    /*=============================================*/ --2 实现全角与半角字符转换的处理函数 CREATE FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8),@step int,@i int,@spc int IF @flag=0 SELECT @pat=N'%[!-~]%',@step=-65248, @str=REPLACE(@str,N' ',N' ') ELSE SELECT @pat=N'%[!-~]%',@step=65248, @str=REPLACE(@str,N' ',N' ') SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str) WHILE @i>0 SELECT @str=REPLACE(@str, SUBSTRING(@str,@i,1), NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step)) ,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str) RETURN(@str) END GO declare T_cursor cursor local for select a.Name, b.Name from sysobjects a join syscolumns b on a.ID=b.ID join systypes c on c.xusertype=b.Xtype where a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char') declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0' fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 17:02:1712楼 得分:0
    用一个函数转换,用游标遍历
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 17:40:1813楼 得分:0
    declare @columnsname varchar(30)
    declare @tablename varchar(20)

    set @tablename='dbo.t_kycl'
    declare getcolumnsname cursor for
    select a.name from syscolumns a,sysobjects b
    where a.id=b.id and b.xtype='u' and a.id=@tablename

    open getcolumnsname

    fetch next from getcolumnsname into @columnsname
    --上面这行提示错误:
    --消息 245,级别 16,状态 1,第 11 行
    --在将 varchar 值 'dbo.t_kycl' 转换成数据类型 int 时失败。
    --请问这里哪有int类型阿?

    while @@fetch_status=0
    begin

    print @columnsname

    fetch next from getcolumnsname into @columnsname
    end

    close getcolumnsname
    deallocate getcolumnsname
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 17:41:5814楼 得分:0
    没有判断列的类型,当然会报错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 17:47:5615楼 得分:0
    SQL code
    --改列的数据全角为半角 declare T_cursor cursor local for select a.Name, b.Name from sysobjects a join syscolumns b on a.ID=b.ID join systypes c on c.xusertype=b.Xtype where a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char') declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0')--少了) fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor go --改列名全角为半角 declare T_cursor cursor local for select a.Name, b.Name from sysobjects a join syscolumns b on a.ID=b.ID where a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0 declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exec('exe sp_rename '''+@tabName+'.'+@ColName+''',''dbo.f_Convert('+@ColName+',0)''') fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 17:50:0016楼 得分:5
    SQL code
    --改列名全角为半角 declare T_cursor cursor local for select a.Name+'.'+b.Name,NameNew=dbo.f_Convert(b.Name) from sysobjects a join syscolumns b on a.ID=b.ID where a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0 declare @tabName sysname,@ColName sysname open T_cursor fetch next from T_cursor into @tabName,@ColName while @@fetch_status=0 begin exe sp_rename @tabName,@ColName fetch next from T_cursor into @tabName,@ColName end close T_cursor deallocate T_cursor
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-01 20:09:2017楼 得分:0
    .......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 00:38:5318楼 得分:0
    exe sp_rename @tabName,@ColName,'Column'--少了列对象
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 10:07:0719楼 得分:0
    谢谢大家给的通用代码,但是对我的问题来说,好像没必要这么复杂,我只要把全角数字改成半角就行了,好像没必要@str NVARCHAR(4000)这么大的字符串,我只想得到列名称,然后用replace替换一下。
    大家说这里代码的类型错了,需要转换,能解释详细点吗?我这个帮助非常相似啊

    SQL code
    declare @columnsname varchar(30) declare @tablename varchar(20) set @tablename='dbo.t_kycl' declare getcolumnsname cursor for select a.name from syscolumns a,sysobjects b where a.id=b.id and b.xtype='u' and a.id=@tablename open getcolumnsname fetch next from getcolumnsname into @columnsname --上面这行提示错误: --消息 245,级别 16,状态 1,第 11 行 --在将 varchar 值 'dbo.t_kycl' 转换成数据类型 int 时失败。 while @@fetch_status=0 begin print @columnsname fetch next from getcolumnsname into @columnsname end close getcolumnsname deallocate getcolumnsname


    联机帮助的示例:
    SQL code
    USE AdventureWorks GO -- Declare the variables to store the values returned by FETCH. DECLARE @LastName varchar(50), @FirstName varchar(50) DECLARE contact_cursor CURSOR FOR SELECT LastName, FirstName FROM Person.Contact WHERE LastName LIKE 'B%' ORDER BY LastName, FirstName OPEN contact_cursor -- Perform the first fetch and store the values in variables. -- Note: The variables are in the same order as the columns -- in the SELECT statement. FETCH NEXT FROM contact_cursor INTO @LastName, @FirstName -- Check @@FETCH_STATUS to see if there are any more rows to fetch. WHILE @@FETCH_STATUS = 0 BEGIN -- Concatenate and display the current values in the variables. PRINT 'Contact Name: ' + @FirstName + ' ' + @LastName -- This is executed as long as the previous fetch succeeds. FETCH NEXT FROM contact_cursor INTO @LastName, @FirstName END CLOSE contact_cursor DEALLOCATE contact_cursor GO
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 10:13:1320楼 得分:0
    sys.columns.name
    这肯定是个字符类型的字段,不可能是int,为什么会提示:
    在将 varchar 值 'dbo.t_kycl' 转换成数据类型 int 时失败。

    再说了,
    fetch next from getcolumnsname into @columnsname
    这是将getcolumnsname的一行内容赋给@columnsname,@columnsname不是int类型阿
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 10:15:4021楼 得分:5
    and a.id=@tablename --這個條件ID為int
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 11:26:2622楼 得分:0
    哦,这里应该是错了,改之后就没有错误
    另外,这个print在哪里出来?
    SQL code
    declare @columnsname varchar(30) declare @tablename varchar(20) set @tablename='dbo.t_kycl' declare getcolumnsname cursor for select a.name from syscolumns a,sysobjects b where a.id=b.id and b.xtype='u' and b.name=@tablename open getcolumnsname fetch next from getcolumnsname into @columnsname while @@fetch_status=0 begin fetch next from getcolumnsname into @columnsname print @columnsname end close getcolumnsname deallocate getcolumnsname
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 13:23:39