怎样在查询分析器里为远程数据库设置字段设为自增列
管理远程的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




