Я обнаружил, что несколько столбцов распределены по дюжине баз данных SQL Server 2014 с устаревшими типами данных text
и ntext
.Поэтому я хотел изменить их на nvarchar(max)
следующим образом:
ALTER TABLE <mytable>
ALTER COLUMN <mycolumn> NVARCHAR(MAX)
Точное выражение было:
ALTER TABLE contacts
ALTER COLUMN notes0 NVARCHAR(MAX)
Я написал скрипт, делая это в цикле.Примерно для 170 столбцов все прошло нормально, но осталось 9 столбцов, выдающих сообщение об ошибке:
Ошибка 596, Невозможно продолжить выполнение, поскольку сеанс находится в состоянии уничтожения
НемецкийВерсия сообщения:
Meldung 596, Ebene 21, Статус 1, Zeile 0
Die Ausführung kann nicht fortgesetzt werden, weil die Sitzung den KILL-Status aufweist.
Meldung 0, Ebene 20, Status 0, Zeile 0
Für den aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten.Löschen Sie eventuelle Ergebnisse.)
Затем я попытался добавить в эту таблицу новый столбец nvarchar(max)
и скопировать в него данные, что дало тот же результат.
ИтакЯ сделал новую таблицу с аналогичным набором столбцов, просто соответствующих типов данных и скопировал данные в нее => это работало отлично!
НО я не мог просто переименовать две таблицы, чтобы поставить новую таблицу вместо старой, потому что индексы не подходили.В приложении жестко запрограммированы их имена (да, я знаю ....)
Поэтому я попытался скопировать данные из новой таблицы в новый столбец, добавленный в старую таблицу.Тот же результат.
Мне все еще нужно изменить тип данных или переместить данные в новый столбец nvarchar(max)
.Что я могу сделать сейчас?
Заранее спасибо, Нильс
-- =============================================
-- Author: NSc
-- Create date: 180918
-- Description: sucht alle TEXT und NTEXT-Spalten und konvertiert sie in
NVARCHAR(MAX)
-- =============================================
CREATE PROCEDURE [dbo].[ConvertAllDeprecatedTEXTColumns2NvarcharMAX]
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #DB
(
id INT,
databaseID INT NOT NULL,
DatabaseName NVARCHAR(50),
IsCobra BIT,
AnzahlAdressen INT
)
CREATE TABLE #CobraTables
(
id INT IDENTITY (1,1) NOT NULL,
DatabaseName NVARCHAR(50),
CobraTableName NVARCHAR(50),
CobraTableID INT,
SQLTableName NVARCHAR(50),
AnzahlZeilen INT
)
CREATE TABLE #CobraColumns
(
id INT IDENTITY (1,1) NOT NULL,
DatabaseName NVARCHAR(50),
CobraTableName NVARCHAR(50),
SQLTableName NVARCHAR (50),
CobraColumnName NVARCHAR(100),
SQLColumnName NVARCHAR(50),
AnzahlZeilen INT,
ColumnType NVARCHAR(50)
)
CREATE TABLE #SQL
(
id INT IDENTITY NOT NULL,
SQLtext NVARCHAR(1000)
)
INSERT INTO #DB (id, databaseID, DatabaseName, IsCobra)
EXEC CheckIfCobraDB
DELETE FROM #DB
WHERE IsCobra = 0
OR DatabaseName = 'cobra_main'
OR DatabaseName LIKE '%DEV%'
OR DatabaseName LIKE '%demo%'
OR DatabaseName LIKE '%invent%'
-- Tabellennamen ermitteln
INSERT INTO #SQL
SELECT
'INSERT INTO #CobraTables (DatabaseName, CobraTablename, SQLTablename, CobraTableID) SELECT ' + CHAR (39) + databasename + CHAR(39) + ', [Userlevel_Name], [Logical_Name], [ID] FROM [' + databasename + '].dbo.[AP_Tables]'
FROM #DB
DECLARE @i INT
SET @i = 1
DECLARE @j INT
SET @j = (SELECT MAX(id) FROM #SQL)
DECLARE @SQL NVARCHAR(1000)
WHILE @i <= @j
BEGIN
SET @SQL = (SELECT SQLtext FROM #SQL WHERE id = @i)
EXEC sp_executesql @SQL
SET @i = (@i + 1)
END
-- select * from #SQL
-- select * from #CobraTables
-- Spalten mit abgekündigten Text-Datentypen finden
DELETE FROM #SQL
DBCC CHECKIDENT (#SQL, reseed, 1)
-- insert into #SQL select 'insert into #CobraColumns (Databasename, cobratablename, sqltablename, cobracolumnname, sqlcolumnname) select distinct' + char (39) + databasename + char (39) + ', ' + char (39) + cobratablename + char (39) + ', ' + char (39) + SQLTableName + char (39) + ', userlevel_name, logical_name from [' + databasename + '].dbo.[AP_Fieldinfos] where len([virtual_field_def]) = 0 and logical_name not like (' + CHAR (39) + '%ID%' + CHAR (39) + ') and [Table_ID] = ' + CAST (CobraTableID as nvarchar (10)) from #CobraTables where SQLTableName not in ('Links', 'linklist', 'images','keywords','keywordlist', 'symbollist') and AnzahlZeilen > 0 order by DatabaseName, CobraTableName
insert into #SQL select 'use ['+ databasename + ']; insert into #CobraColumns (Databasename, SQLtablename, SQLcolumnname, ColumnType) select ' + CHAR (39) + databasename + char (39) + ', o.name, c.name , t.name from sys.all_columns as c inner join sys.types as t on t.system_type_id=c.system_type_id inner join sys.tables as o on o.object_id=c.object_id where t.name like ' + CHAR (39) + '%text%' + CHAR (39) + ' order by o.name' from #DB
-- select * from #SQL
SET @i = 1
SET @j = (SELECT MAX(id) FROM #SQL)
WHILe @i<=@j
BEGIN
SET @SQL = (SELECT SQLtext FROM #SQL WHERE id = @i)
EXEC sp_executesql @SQL
SET @i = (@i + 1)
END
SELECT * FROM #CobraColumns
-- delete from #CobraColumns where SQLTableName= 'Contacts' and SQLColumnName like 'NOTES%' -- and DatabaseName = 'BCM'
-- Spalten konvertieren
DELETE FROM #SQL
DBCC CHECKIDENT (#SQL, reseed, 1)
INSERT INTO #SQL
SELECT 'ALTER TABLE [' + DatabaseName + '].dbo.[' + SQLTableName + '] ALTER COLUMN ' + SQLColumnName + ' NVARCHAR(MAX)'
FROM #CobraColumns
SELECT * FROM #SQL
SET @i = 1
SET @j = (SELECT MAX(id) FROM #SQL)
-- /***
WHILE @i <= @j
BEGIN
SET @SQL = (SELECT SQLtext FROM #SQL WHERE id = @i)
PRINT @SQL
EXEC sp_executesql @SQL
SET @i = (@i + 1)
END
-- ***/
END