CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

怎样在查询分析器里为远程数据库设置字段设为自增列

楼主lcy5415(沈阳退役程序员)2005-06-03 21:49:30 在 MS-SQL Server / 基础类 提问

管理远程的sql服务器,因现在无法用企业管理器,只能用查询分析器.现在数据库的自增都没了,网站无法访问,请问怎样用查询分析器改并保留现在数据,  
   
  例:表info,有个自增列id,怎样在查询分析器将id,设为自增列(标识列),而保持现在数据不变.  
   
   
  在线结贴!!!!!!!! 问题点数:0、回复次数:12Top

1 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-06-03 22:07:04 得分 0

What's   your   mean?  
   
  info的id列失去了自动增长属性,现在想恢复?Top

2 楼yjdn(人形机器)回复于 2005-06-03 22:07:37 得分 0

不能改为标识,只能添加为标识列  
  可以把那个字段删除,再添加为标识列Top

3 楼lcy5415(沈阳退役程序员)回复于 2005-06-03 22:17:52 得分 0

不用恢复,那里有数据.但现在新添加信息就不能加,请各们给个代码,我急用.如果不能改为标识就不行了Top

4 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-06-03 22:28:57 得分 0

新添加数据出什么错?  
   
  DBCC   CHECKTABLE('表名')Top

5 楼lcy5415(沈阳退役程序员)回复于 2005-06-03 22:37:37 得分 0

不用录入null值.因为程序写时id列是自增,现在不能自增,又不能录null,一定出错libin_ftsafe(子陌红尘)   ,你在线一定都关照这个贴,谢谢,请多写几行,用Alter   table   表名     ,,,这个改不了自增Top

6 楼lcy5415(沈阳退役程序员)回复于 2005-06-03 22:41:18 得分 0

libin_ftsafe(子陌红尘)   你忙完我在下线Top

7 楼lcy5415(沈阳退役程序员)回复于 2005-06-03 22:41:58 得分 0

libin_ftsafe(子陌红尘)   你多帮帮忙Top

8 楼zjcxc(邹建)回复于 2005-06-04 08:05:19 得分 0

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_ToIDENTITY]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_ToIDENTITY]  
  GO  
   
  /*--普通列转换为标识列  
   
  采用修改表名,然后按新规则建表的方法处理  
  只适用于没有与其他对象有关联的表  
  转换后,列的相关对象也不会恢复  
  因此这种处理有很大局限性,仅供参考  
   
  --邹建   2005.05(引用请保留此信息)--*/  
   
  /*--调用示例  
   
  EXEC   p_ToIDENTITY   'tb','id'  
   
  --使用测试  
   
  --创建测试的表  
  create   table   tb(编号   bigint,姓名   varchar(10))  
  insert   tb   select   1,'张三'  
  union   all   select   2,'李四'  
  union   all   select   4,'王五'  
  go  
   
  --调用存储过程,将编号字段改为标识字段  
  exec   p_ToIDENTITY   'tb','编号'  
  go  
   
  --显示处理结果  
  select   *   from   tb  
   
  --显示是否修改成功  
  select   name   from   syscolumns    
  where   object_id('tb')=id   and   status=0x80  
  go  
   
  --删除测试  
  drop   table   tb  
  --*/  
  CREATE   PROC   p_ToIDENTITY  
  @TableName   sysname,   --要处理的表名  
  @FieldName   sysname,   --要转换的列名,必须是整型数据字段  
  @increment   int=1         --标识值的增量  
  AS  
  IF   ISNULL(OBJECTPROPERTY(OBJECT_ID(@TableName),N'IsUserTable'),0)=0  
  BEGIN  
  RAISERROR('"%s"   必须是当前数据库中已经存在的用户表',12,16,@TableName)  
  RETURN  
  END  
   
  --标识列转换处理检查  
  DECLARE   @s1   nvarchar(1000),@s2   nvarchar(4000),@bkTableName   sysname  
  SELECT   @s2='',@bkTableName=CAST(NEWID()   as   char(36)),  
  @s1=CASE  
  WHEN   c.status=0x80    
  THEN   N'表"%s"中已经有标识列'+QUOTENAME(c.name,N'"')  
  +N',列"%s"不能再被转换成标识列'  
  WHEN   t.name   LIKE   '%int'    
  THEN   N','+QUOTENAME(c.name)  
  +N'=IDENTITY('+QUOTENAME(t.name)  
  +N',1,'+CAST(@increment   as   varchar)+N')'  
  WHEN   c.scale=0   AND   t.name   IN(N'decimal',N'numeric')    
  THEN   N','+QUOTENAME(c.name)  
  +N'=IDENTITY('+QUOTENAME(t.name)  
  +N'('+CAST(c.prec   as   varchar)+N')'  
  +N',1,'+CAST(@increment   as   varchar)+N')'  
  ELSE   N'表"%s"中的列"%s"定义"'+QUOTENAME(t.name)  
  +CASE   WHEN   c.scale>0    
  THEN   N'('+CAST(c.prec   as   varchar)  
  +N','+CAST(c.scale   as   varchar)+N')'  
  ELSE   N''   END  
  +N'无效,不能转换为标识列'  
  END  
  FROM   sysobjects   o,syscolumns   c,systypes   t  
  WHERE   o.name=@TableName  
  AND   o.id=c.id  
  AND   c.xusertype=t.xusertype  
  AND(c.name=@FieldName   OR   c.status=0x80)  
  IF   @@ROWCOUNT=0  
  BEGIN  
  RAISERROR(N'表   "%s"   中无列   "%s"',12,16,@TableName,@FieldName)  
  RETURN  
  END  
  IF   LEFT(@s1,1)<>','  
  BEGIN  
  RAISERROR(@s1,12,16,@TableName,@FieldName)  
  RETURN  
  END  
   
  --生成要处理的列  
  SELECT   @s2=@s2+N','+QUOTENAME(c.name)  
  FROM   sysobjects   o,syscolumns   c  
  WHERE   o.name=@TableName  
  AND   o.id=c.id  
  ORDER   BY   c.colid  
  SELECT   @s1=REPLACE(@s2+N',',N','+QUOTENAME(@FieldName)+N',',@s1+N','),  
  @s1=SUBSTRING(@s1,2,LEN(@s1)-2),  
  @s2=STUFF(@s2,1,1,N'')  
   
  --修改原表名  
  EXEC   sp_rename   @TableName,@bkTableName  
   
  --转换为标识列处理  
  SELECT   @TableName=QUOTENAME(@TableName),  
  @bkTableName=QUOTENAME(@bkTableName)  
  EXEC('  
  SELECT   '+@s1+'   INTO   '+@TableName+N'    
  FROM   '+@bkTableName+'   WHERE   1=0  
  SET   IDENTITY_INSERT   '+@TableName+N'   ON  
  INSERT   '+@TableName+N'('+@s2+N')  
  SELECT   '+@s2+N'   FROM   '+@bkTableName+N'  
  SET   IDENTITY_INSERT   '+@TableName+N'   OFF  
  DROP   TABLE   '+@bkTableName)  
  GO  
  Top

9 楼zjcxc(邹建)回复于 2005-06-04 08:06:25 得分 0

alter   table不支持在普通列和标识列之间转换.   你可以参考上面的存储过程,但要注意使用存储过程修改的限制.Top

10 楼juliy(juliy(菜市場))回复于 2005-06-04 16:38:59 得分 0

用企業管理器在表設計中存儲表修改指令,   將存儲修改表指令拿去執行。  
  要把指令處理一下,把刪除和建立關聯的去掉。  
  .........可行............  
  Top

11 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-06-04 17:11:25 得分 0

to:lcy5415   (沈阳.NET)  
  ---------------------------------------------------  
  昨天晚上单位断网了,用楼上邹老大的方法可以解决问题。Top

12 楼lcy5415(沈阳退役程序员)回复于 2005-06-04 20:54:27 得分 0

明白了,谢谢.我   现在移动上网,改日用adsl时结帐.谢谢邹建)   及子陌红尘)和其它朋友!Top

相关问题

  • 现在我的企业管理器打不开了,只能用查询分析器,可我不知道怎样用SQL语句在原表的基础上增加字段并设置其类型
  • 在SQL SERVER 中,如何在"查询分析器" 中添加一个字段
  • 如何在查询分析器里更改某数据表中的字段名?
  • 怎么才能在查询分析器中更新这样的字段
  • 能不能在查询分析器中修改表格中的字段名?
  • 用sql查询分析器可以只改变数据库中的一个字段的长度
  • 急!如何在查询分析器中只显示时间字段的年月日部分
  • 请教:如何在查询分析器里查看image类型的字段的内容
  • 在SQL查询分析器中插入记录时,其余字段为默认值,如何做?
  • 请教大虾,在查询分析器里用什么语句把表里的字段显示出来??????????

关键词

  • 分析器
  • 字段
  • 查询
  • 转换
  • 存储过程
  • 指令
  • 修改
  • 数据
  • bktablename
  • 增列

得分解答快速导航

  • 帖主:lcy5415

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo