Как изменить столбец TEXT в таблице базы данных на сервере SQL? - PullRequest
2 голосов
/ 17 сентября 2008

В базе данных сервера SQL у меня есть таблица, которая содержит поле TEXT, в котором разрешены значения NULL. Мне нужно изменить это, чтобы не допустить NULL. Я могу сделать это без проблем через Enterprise Manager, но когда я пытаюсь запустить следующий скрипт, изменить таблицу dbo. [EventLog] Изменить столбец [Сообщение] текст Не ноль , я получаю ошибку:

Невозможно изменить столбец «ErrorMessage», так как это «текст».

Чтение SQL Books Online действительно показывает, что вам не разрешено делать ALTER COLUMN в текстовых полях. Я действительно должен быть в состоянии сделать это через скрипт, а не вручную в Enterprise Manager. Какие есть варианты сделать это в скрипте?

Ответы [ 6 ]

4 голосов
/ 17 сентября 2008

Вы можете использовать Enterprise Manager для создания вашего скрипта. Щелкните правой кнопкой мыши по таблице в EM и выберите Design. Снимите флажок «Разрешить пустые значения» для поля «Текст». Вместо того, чтобы нажимать обычный значок сохранения (дискета), щелкните значок, который выглядит как золотой свиток с крошечной дискеткой, или просто выполните команду «Дизайнер таблиц»> «Создать сценарий изменения» из меню. Сохраните скрипт в файл, чтобы вы могли использовать его повторно. Вот пример сценария:

    /* 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 голосов
/ 17 сентября 2008

Создать новое поле. Скопируйте данные через. Брось старое поле. Переименуйте новое поле.

1 голос
/ 17 сентября 2008

Я думаю, что избавиться от нулевых значений - это просто.

(как сказал 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  
0 голосов
/ 17 сентября 2008

Попробуйте сгенерировать скрипт изменения из Enterprise Manager, чтобы увидеть, как это делается там

0 голосов
/ 17 сентября 2008

Я бы обновил все столбцы значениями NULL и установил бы в него пустую строку, например, '' Тогда вы сможете без проблем запустить скрипт ALTER TABLE. Гораздо меньше работы, чем создание нового столбца.

0 голосов
/ 17 сентября 2008

Вдобавок ко всему, я бы сказал, что вам нужно создать новую таблицу с такой же структурой, как у существующей таблицы, но с вашим текстовым столбцом, для которого задано значение не ноль, а затем выполнить запрос для перемещения записей из одного другой.

Я понимаю, что это своего рода псевдокодовый ответ, но я думаю, что это действительно единственный вариант, который у вас есть.

Если другие, которые лучше разбираются в точном синтаксисе TSQL, хотят дополнить этот ответ, не стесняйтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...