2016-07-01 6 views
1

大きなデータベースがあり、正規化する必要があります。テーブルの1つに "integer"型のフィールドが含まれていますが、値は1と0のみです。したがって、このフィールドをビットタイプに変換するのがよい理由です。しかし、SQL Server Management Studioの変更を保存しようとすると、それはできません。また、私はnvarcharのような値を持つ多くのフィールドをintに変換する必要があるintまたはfloatに変換する必要があります。SQLサーバーからint型フィールドにビットを変換する

また、データを失うことなく実際のデータベースを更新できるように、すべての変更について移行スクリプトを作成する必要があります。おそらく、誰かがこれに有用なユーティリティを知っているでしょうか?

編集:私はそれを落とさずには更新できないことを私に伝えます。そして、データを失うことなくテーブルを更新したい。

SQLバージョン2014

+0

SQL Server管理スタジオ単にあなたが「できない」よりも少しだけ多くの兆候を出す...正確なエラーは何ですか?どのバージョンのSQL Serverを使用していますか?もしあなたが2012+を使用しているなら、 'TRY_CONVERT'を使って問題の行を特定することができます - ' SELECT * FROM YourTable WHERE TRY_CONVERT(BIT、YourColumn)はNULLで、YourColumnはNULLではありません; – GarethD

+1

本当に "あなたはやる? "それとも理由があるのでしょうか? –

+0

あなたの最後の文は、あなたがオフサイトのリソースを求めているので、あなたの質問が話題外であると断定されます。あなたが試したこととあなたが持っていた問題を示して、それを修正しようとすることができます。 –

答えて

2
---Create one Temp. Column 
    Alter Table [dbo].[Demo2] 
    Add tempId int 

    GO 

    --Copy Data in temp. Coulmn 
    Update [dbo].[Demo2] set tempId=Id 


    --Drop column which you want to modify 
    Alter Table [dbo].[Demo2] 
    Drop Column Id 
    Go 

    --Create again that column with bit type 
    Alter Table [dbo].[Demo2] 
    Add Id bit 
    GO 
    --copy date back 
    Update [dbo].[Demo2] set Id=tempId 

    --drop temp column 
    Alter Table [dbo].[Demo2] 
    Drop Column tempId 

    Go 
+0

はい、これは素晴らしい解決策ですが、私は約300のテーブルを持っており、それぞれに約2-3の非正規化フィールドが含まれています。これは手動ですべてをodするのには非常に時間がかかるでしょう。私は "Ent.Manager"について読んだ。少数のクリックであなたが書いたのと同じ仕事をします。しかし、私はこのプログラムを見つけることができません – dantey89

+0

@ dantey89は300テーブルに変更することは、私が軽く取るだろうものではありません!これを一度にボード全体でやりたければ、動的なSQLを使って変更を入力し、変更したいテーブルを反復することをお勧めします。 –

0
ここ

移行スクリプトあなたを生成するには、古い列

CREATE TABLE #test 
(inttest int 

) 

Insert [#test] 
     ([inttest]) 
Values (0 
     ) 


Insert [#test] 
     ([inttest]) 
Values (1 
     ) 

Alter Table [#test] Add bittest bit 

Update [#test] Set bittest=inttest 

Alter Table [#test] Drop Column [inttest] 

SELECT * FROM [#test] [T] 
0

を、テーブルに新しい列を追加し、古い列にその列を設定し、削除する方法です特別なユーティリティは必要ありませんが、SSMSはかなりうまくいきます。

SSMSオブジェクトエクスプローラでテーブルを右クリックします。コンテキストメニューでDesignアイテムを選択します。列のタイプを変更します。メインメニューTable DesignerGenerate Change Scriptを選択してください。生成されたスクリプトをファイルに保存してレビューし、運用システムで実行する前に各行を理解していることを確認してください。必要に応じてスクリプトを調整します。一方


は、あなたが ALTER TABLEのステートメントを使用することができます bitintから列タイプを変更するには:あなたは、実際の int値は0のみが実際にあることを確認する必要があり、これを実行する前に

ALTER TABLE dbo.TableName 
ALTER COLUMN ColumnName bit NOT NULL 

をし、 1.

+0

私はこれを好きでしたが、できないことを示しています原因となってテーブルを削除して再作成することはできません – dantey89

+0

1)あなたの質問に正確なエラーメッセージを含めることをお勧めします。 2)このような変更を行うための権限を持つユーザーとしてログインする必要があります。 3)サードパーティのユーティリティはここでは役に立ちません。 –

+0

私はとにかくできないという問題。私はすべてのデータを安全に保つべきです – dantey89

0

すべてのコメントと投稿を読み終えたら、渡されたテーブルとカラムを必要に応じて変換するビルド手順の解決策が見つかりました。だから私は

IF EXISTS (select * from dbo.sysobjects where id = object_id(N'IntToBit') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
DROP PROCEDURE IntToBit 
GO 


IF OBJECT_ID('convertion_table', 'U') IS NOT NULL 
DROP TABLE dbo.convertion_table; 
go 

CREATE TABLE dbo.convertion_table 
(
    bitTypeColumn bit NOT NULL DEFAULT 0, 
    intTypeColumnt integer , 
) 
go 

CREATE procedure IntToBit 
@table nvarchar(150), 
@column nvarchar(150) 

AS 
begin 

DECLARE @sql nvarchar(4000) 
SELECT @sql =' 
    --copy data to temp table 
    INSERT INTO convertion_table (bitTypeColumn) 
    SELECT '[email protected] +' 
    FROM ' [email protected]able+' 

    --Drop column which you want to modify 
    Alter Table ' [email protected]+' 
    Drop Column '[email protected] +' 


    --Create again that column with bit type 
    Alter Table ' [email protected]+' 
    Add '[email protected] +' bit NOT NULL DEFAULT(0) 

    --copy date back 
    INSERT INTO '[email protected]+'('[email protected]+') 
    SELECT bitTypeColumn 
    FROM convertion_table 

    --cleare temp table 
    --DELETE bitTypeColumn FROM convertion_table 
    ' 
    exec sp_executesql @sql 
end 
GO 

この機能を書いた後、フィールドとテーブル名を渡して呼び出す:クリスKHitesh Thakorへ

exec dbo.IntToBit @table = 'tbl_SystemUsers', @column='intUseLogin'; 

感謝

0

単に使用TSQLスクリプトへデザイナーを使用せずにテーブルを変更する

ALTER TABLE YourTableNameHere 
ALTER COLUMN YourColumnNameHere INT 

テーブルを変更する前にテーブルのスクリプトを生成して、データを失わないようにしたい場合は、スクリプトを使用してすべてを取得することができます。

関連する問題