簡體   English   中英

暫時禁用SQL Server中的空約束

[英]Temporarily disable null constraint in SQL Server

我正在使用包含對數據庫所做的更改的腳本,這些更改會使數據庫暫時處於無效狀態。 目前,我在開始時禁用了所有約束,然后在腳本末尾使用以下代碼重新啟用它們:

/*** Disable all constraints ***/
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
/*** Enable all constraints ***/
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

但這並不能禁用空約束,據我所了解的是,空約束與FK約束的處理方式不同。

我認為有必要更改所有表以使它們允許為null,然后在腳本末尾再次更改它們。

我無法“硬編碼”表的名稱,因為我沒有該信息,因此我無法執行很多語句,例如:

ALTER TABLE someTable ALTER COLUMN someColumn INT NULL

它必須是動態的。 關於如何實現此目標的任何想法?

編輯:我無法處理的一種情況是向現有表中添加一個新的非null列。 我沒有控制添加此列的腳本(它是由自動化工具創建的),創建的腳本是ALTER TABLE someTable ADD someColumn INT NOT NULL ,在此語句之后,發生了一些刪除/插入/更新,使someTable成為處於有效狀態,但該錯誤發生在ALTER語句上

這是一個腳本,在其中我從text類型中選擇所有字段以使其成為varchar(max) 您的方法類似,但是您需要對其進行修改以適合您的使用。

  • 更改SQL以找到所需的正確c.xtype。

  • 根據您的需求修改WHERE語句,將@sql_select更改為您的需求。

  • 打印它進行測試,然后根據需要取消對EXEC的注釋。

我的代碼(用於編輯):

-- change all text to varchar(max)
DECLARE @sql_select NVARCHAR(MAX);
DECLARE @table_name VARCHAR(MAX);
DECLARE @column_name VARCHAR(MAX);

DECLARE local_column_update_cursor CURSOR FOR

SELECT c.name as column_name, o.name as table_name 
FROM dbo.syscolumns c, dbo.sysobjects o
WHERE c.xtype IN (35,99) -- text/ntext
  AND o.id = c.id
  AND OBJECTPROPERTY(o.id, N'IsUserTable') = 1

OPEN local_column_update_cursor
FETCH NEXT FROM local_column_update_cursor
INTO @column_name, @table_name

WHILE @@FETCH_STATUS = 0
BEGIN

SET @sql_select = 'ALTER TABLE ' + @table_name + ' ALTER COLUMN ' + @column_name + ' VARCHAR(MAX)'
--EXEC sp_executesql @sql_select
PRINT @sql_select

FETCH NEXT FROM local_column_update_cursor
INTO @column_name, @table_name
END

DEALLOCATE local_column_update_cursor

GO

如果有更多時間,我可能會編輯以根據您的需求完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM