?? 14.3.3 普通列轉換為標識列.sql
字號:
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)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -