2017-02-23 69 views
2

问:
不会丢失任何数据,哪能:

#1。将列数据类型从Varchar转换为Bigint?SQL - 从varchar转换列数据类型与依赖关系为bigint

比方说:

table1.my_ID = “12345” //默认为varchar

变化为:

table1.my_ID = 12345 //转换为bigint

#2。 ..以及我如何做到这一点,如果我的表有很多依赖关系?

我试过ALTER TABLE和ALTER COLUMN:

ALTER TABLE [MY_DATABASE].[dbo].table1 
ALTER COLUMN my_ID BIGINT 

,我得到了这些:

消息5074,级别16,状态1,行1
对象 'PK_table1' 依赖在'my_ID'列上。

消息5074,级别16,状态1,行1
对象'FK_table2_table1'依赖于'my_ID'列。

消息5074,级别16,状态1,行1
对象'FK_table3_table1'依赖于'my_ID'列。

..blah等等..

消息4922,级别16,状态9,1号线
ALTER TABLE ALTER COLUMN添加my_id失败,因为一个或多个对象 访问此列。

请大家帮忙。

谢谢!

+0

为了帮助人们快速回答这个问题,你可以提供您的架构等的SQL-小提琴任何机会呢? –

+2

最好是删除这些约束,创建新的列作为int,更新表与旧列填充新列,重新创建约束和删除varchar列 – Veljko89

回答

0

在这里你去:

CREATE TABLE A (
ID VARCHAR (10) NOT NULL , 
AA VARCHAR (10) NOT NULL 
) 
GO 
CREATE TABLE #B (
ID BIGINT NOT NULL , 
BB VARCHAR (10) NOT NULL 
) 
GO 

INSERT INTO A VALUES ('123','AAA'); 

INSERT INTO #B 
SELECT CONVERT(BIGINT,ID) , AA FROM A; 

SELECT * FROM A; 
SELECT * FROM #B; 

ALTER TABLE A 
ALTER COLUMN ID BIGINT NOT NULL; 

INSERT INTO A 
SELECT * FROM #B; 

SELECT * FROM A; 
SELECT * FROM #B; 

DROP TABLE #B; 

或者你可以尝试:

CREATE TABLE A (
ID VARCHAR (10) NOT NULL , 
AA VARCHAR (10) NOT NULL 
) 
GO 
INSERT INTO A VALUES ('123','AAA'); 

ALTER TABLE A 
ADD C1 BIGINT ; 

UPDATE A 
SET C1 = (SELECT CONVERT(BIGINT , ID) FROM A); 

SELECT * FROM A; 

ALTER TABLE A 
DROP COLUMN ID; 

ALTER TABLE A 
ALTER COLUMN C1 BIGINT NOT NULL; 

ALTER TABLE A 
ADD CONSTRAINT PK_ID PRIMARY KEY (C1); 

EXEC sp_rename 'A.C1' , 'ID' , 'COLUMN'; 
相关问题