SQL Server 2014 - устаревшая проблема с типом данных - ошибка 596, не удается продолжить выполнение, так как сеанс находится в состоянии уничтожения - PullRequest
0 голосов
/ 18 сентября 2018

Я обнаружил, что несколько столбцов распределены по дюжине баз данных 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

1 Ответ

0 голосов
/ 18 сентября 2018

У меня была эта проблема раньше, я нашел ответ в этом посте, https://www.sqlservercentral.com/Forums/1809734/CHECKDB--Cannot-continue-the-execution-because-the-session-is-in-the-kill-state

Это сообщение об ошибке вызвано тем, что ваш сервер HAG (группа высокой доступности) переключается с одного узла на другой.другой.Если ваша HAG находится в режиме синхронной фиксации, записи журнала не могут быть зафиксированы на первичном узле, пока они не будут записаны на вторичные узлы.Если сердцебиение между компьютерами завершается неудачно и сервер пытается выполнить аварийное переключение, он должен убедиться, что оба узла находятся в согласованном состоянии.Базы данных изменяются с режима синхронизации на режим разрешения, и все транзакции на первичном узле, которые не были зафиксированы на вторичных узлах, откатываются.Этот откат является тем, что выдает сообщение об ошибке, поскольку состояние автоматического отката такое же, как если бы вы ввели команду уничтожения для SPID.Причина обычно связана с сетью, особенно если узлы географически разделены, как это будет в случае с копией DR на удаленном сайте.Если это не так, то проверяйте локальные сетевые карты и коммутаторы.Рекомендуемое разрешение от Microsoft - увеличить значения LeaseTimeout и / или HealthChecktimeout.

Сначала я увеличил размер диска, затем увеличил HealthChecktimeout и он ушел.

...