2016-07-01 52 views
1

我有一個大的數據庫,我應該規範化它。其中一個表包含類型爲「整數」的字段,但它只包含1和0值。所以將此字段轉換爲位類型是很好的理由。但是,當我嘗試在SQL Server Management Studio中保存更改時,它告訴我我無法做到這一點。此外,我有許多字段值如nvarchar應該轉換爲int或float,也應該轉換爲int也。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個未規範化的字段。這對於手動輸入所有內容都會很長。我讀了關於「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 Designer中選擇項目Generate Change Script。將生成的腳本保存到一個文件中,檢查它並確保在生產系統上運行它之前瞭解其中的每一行。根據需要調整腳本。


在另一方面,從int列類型更改爲bit可以使用ALTER TABLE聲明:

ALTER TABLE dbo.TableName 
ALTER COLUMN ColumnName bit NOT NULL 

運行此之前,你應該檢查實際int值確實是只有0和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]+' 

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

,然後把它傳遞領域和表名:

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

特別感謝克里斯ķ亞太區首席技術官Matt Thakor

0

簡單地使用T-SQL腳本修改表格而不是使用設計師

ALTER TABLE YourTableNameHere 
ALTER COLUMN YourColumnNameHere INT 

如果您使用的是SQL Server,那麼您可能希望在更改表之前爲表格生成腳本,這樣您就不會丟失任何數據..並且您可以使用腳本簡單檢索所有內容