2

SQL サーバー データベースに、NULL を許可するように設定された TEXT フィールドを含むテーブルがあります。NULL を許可しないようにこれを変更する必要があります。Enterprise Manager を使用してこれを問題なく実行できますが、次のスクリプトを実行しようとすると、テーブル dbo を変更します。[イベント ログ] 列を変更します [メッセージ] テキストが nullではありません。エラーが発生します。

「テキスト」であるため、列「ErrorMessage」を変更できません。

SQL Books Online を読むと、TEXT フィールドに対して ALTER COLUMN を実行することが許可されていないことが明らかになります。ただし、Enterprise Manager で手動ではなく、スクリプトを介してこれを実行できる必要があります。スクリプトでこれを行うためのオプションは何ですか?

4

6 に答える 6

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
于 2008-09-17T12:58:21.997 に答える
2

新しいフィールドを作成します。データをコピーします。古いフィールドを削除します。新しいフィールドの名前を変更します。

于 2008-09-17T12:46:01.340 に答える
1

null 値を取り除くのが最も簡単だと思います。

(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  
于 2008-09-17T13:10:24.247 に答える
0

私の頭の上から、既存のテーブルと同じ構造を持つ新しいテーブルを作成する必要があると思いますが、テキスト列を null 以外に設定し、クエリを実行してレコードをあるレコードから別のレコードに移動する必要があります。

それは疑似コードの答えのようなものだと思いますが、それが本当に唯一の選択肢だと思います。

正確なTSQL構文をよりよく把握している他の人がこの回答を補足することを気にかけている場合は、お気軽に。

于 2008-09-17T12:47:35.520 に答える
0

すべての列を NULL 値で更新し、'' などの空の文字列に設定します。その後、問題なく ALTER TABLE スクリプトを実行できるはずです。新しい列を作成するよりもはるかに少ない作業です。

于 2008-09-17T12:49:28.667 に答える
0

Enterprise Manager 内から変更スクリプトを生成して、そこでどのように行われるかを確認してください。

于 2008-09-17T12:51:30.580 に答える