2

データベースを一時的に無効な状態にする可能性のあるデータベースへの変更を含むスクリプトを使用しています。現在、最初にすべての制約を無効にしてから、スクリプトの最後で次のコードを使用して再度有効にします。

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

しかし、これはnull制約を無効にしません。私が読んだことから、null制約はFK制約とは異なる方法で扱われることがわかったからです。

すべてのテーブルを変更して null を許可し、スクリプトの最後で再度変更する必要があると思います。

その情報がないため、テーブルの名前を「ハードコード」することはできません。そのため、次のような多くのステートメントを実行できません。

ALTER TABLE someTable ALTER COLUMN someColumn INT NULL

動的である必要があります。どうすればこれを達成できるかについてのアイデアはありますか?

編集: 私が処理できないシナリオの 1 つは、新しい非 null 列を既存のテーブルに追加することです。この列を追加するスクリプトを制御できません (自動化されたツールによって作成されます)。作成されたスクリプトはALTER TABLE someTable ADD someColumn INT NOT NULL、このステートメントの後に削除/挿入/更新が発生しsomeTableて有効な状態になりますが、エラーが発生しますALTER声明について

4

1 に答える 1

0

これは、 typetextからすべてのフィールドを選択して作成するスクリプト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

もう少し時間があれば、後でご要望に合わせて編集して完成させるかもしれません。

于 2012-06-11T14:51:11.273 に答える