2008-09-17 80 views
2

在SQL服務器數據庫中,我有一個包含TEXT字段的表,該字段被設置爲允許NULL。我需要改變這個不允許NULL。我可以通過企業管理器做這沒有問題,但是當我嘗試運行下面的腳本,ALTER TABLE DBO [事件日誌]改變列[消息]文本不是空,我得到一個錯誤:如何更改SQL Server中數據庫表上的TEXT列?

無法更改列'ErrorMessage',因爲它是'文本'。

閱讀網上圖書SQL確實揭示你不允許做文本字段的ALTER COLUMN。我真的需要能夠通過腳本完成此操作,而不是在Enterprise Manager中手動完成。那麼在腳本中做這個選項有什麼選擇呢?

回答

4

您可以使用Enterprise Manager來創建自己的腳本。右鍵單擊EM中的表格並選擇設計。取消選中文本字段的允許空值列。而不是點擊常規保存圖標(軟盤),點擊一個圖標,看起來像一個微軟的黃金滾動或只需從菜單中執行表設計器>生成更改腳本。將腳本保存到一個文件,以便您可以重複使用它。這裏是一個示例腳本:

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 
BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_TestTable 
    (
    tableKey int NOT NULL, 
    Description varchar(50) NOT NULL, 
    TextData text NOT NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
IF EXISTS(SELECT * FROM dbo.TestTable) 
    EXEC('INSERT INTO dbo.Tmp_TestTable (tableKey, Description, TextData) 
     SELECT tableKey, Description, TextData FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)') 
GO 
DROP TABLE dbo.TestTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO 
ALTER TABLE dbo.TestTable ADD CONSTRAINT 
    PK_TestTable PRIMARY KEY CLUSTERED 
    (
    tableKey 
    ) ON [PRIMARY] 

GO 
COMMIT 
2

創建一個新的領域。跨數據複製。放棄舊領域。重命名新字段。

0

關閉我的頭頂,我說你需要創建一個新的表具有相同的結構現有的表,但與你的文本列設置爲不爲空,然後運行一個查詢到的記錄從一個移動到另一個。

我知道這是不大不小的僞代碼的答案,但我認爲這是真的,你已經得到了唯一的選擇。

如果別人用確切的TSQL語法護理更好的抓地力,以補充這個答案,感覺很自由。

0

我將更新所有NULL值的列,並將其設置爲空字符串,例如,「」。那麼你應該可以毫無問題地運行你的ALTER TABLE腳本。比創建新列少得多。

0

嘗試從企業管理器中生成更改腳本,看看它是如何做有

1

我認爲擺脫空值是easist。

(如raz0rf1sh所說)

CREATE TABLE tmp1(col1 INT identity (1, 1), col2 TEXT)  
GO 

INSERT 
INTO  tmp1 
SELECT NULL 

GO 10 

SELECT * 
FROM  tmp1 

UPDATE tmp1 
SET  col2 = '' 
WHERE col2 IS NULL 

ALTER TABLE tmp1 
ALTER COLUMN col2 TEXT NOT NULL 

SELECT * 
FROM  tmp1 

DROP TABLE tmp1 
相關問題