2017-02-23 33 views
2

質問にBIGINTするvarchar型から列のデータ型を変換します

#1:どのようにすることができ、任意のデータを失うことなく
列データ型をVarcharからBigintに変換しますか?SQL - 依存関係

さんが言ってみましょう:

table1.my_ID = "12345" //デフォルトではvarchar

変更へ:

table1.my_ID = 12345 //は

をBIGINTに変換#2。 ..そして、私のテーブルにたくさんの依存関係がある場合はどうしたらいいですか?

私はALTER TABLEを試してみましたが、列を変更:

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';