ANSI_PADDING и переключение разделов - PullRequest
0 голосов
/ 04 мая 2020

Я в процессе миграции нескольких локальных SQL экземпляров Server 2008R2 Enterprise Edition в AWS. Новые SQL серверы 2017 Enterprise Edition, размещенные на экземплярах EC2.

В настоящее время в нашем SQL Server 2008R2 некоторые большие таблицы разделены (по дате). У меня есть сценарий управления разделами, который первого числа каждого месяца создает новый раздел и отключает самый старый раздел. Это отлично работает. Однако многие столбцы в многораздельных таблицах были созданы с ANSI_PADDING OFF. Когда выполняется процесс управления разделами, он создает промежуточную таблицу, а затем итеративно добавляет новые столбцы в промежуточную таблицу, устанавливая ANSI_PADDING в зависимости от параметра столбца исходных таблиц. Эта промежуточная таблица впоследствии используется в переключателе разделов. Ниже приведен фрагмент кода @

SELECT @AnsiPadding = is_ansi_padded FROM sys.columns WHERE object_id = object_id(@SourceTable) AND [name] = @columnname

    IF @AnsiPadding = 1
        BEGIN
        SET  @CreateTablestmt = 'SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON SET ANSI_PADDING ON ALTER TABLE '+@Newtablename+ ' ADD [' + @columnname + ']  '+ @DatatypeFormat + ' ' + @nullvalue 
        PRINT @CreateTablestmt
        EXEC (@CreateTablestmt)                 
        END
        ELSE
        BEGIN
        SET  @CreateTablestmt = 'SET ANSI_PADDING OFF ALTER TABLE '+@Newtablename+ ' ADD [' + @columnname + ']  '+ @DatatypeFormat + ' ' + @nullvalue 
        PRINT @CreateTablestmt
        EXEC (@CreateTablestmt)
 END

Я только что тестировал эту же процедуру в SQL Server 2017 EE, и она не работает.

При создании промежуточной таблицы я получаю следующую ошибку:

Msg 50000, Level 16, State 1, Line 533
CONDITIONAL failed because the following SET options have incorrect settings: 'ANSI_PADDING'. 
Verify that SET options are correct for use with indexed views and/or indexes on 
computed columns and/or filtered indexes and/or query notifications 
and/or XML data type methods and/or spatial index operations.

Простое воспроизведение на Microsoft SQL Server 2017 (RTM-CU17) (KB4515579) - 14.0.3238.1 (X64) 13 сентября 2019 15:49:57 Авторское право (C) 2017 Корпорация Microsoft Enterprise Edition (64-разрядная версия) на Windows Server 2016 Datacenter 10.0 (сборка 14393:) (гипервизор)

SET ANSI_PADDING ON;
CREATE TABLE testANSI (col1 VARCHAR(15))
GO
SET ANSI_PADDING OFF;
ALTER TABLE testANSI ADD col2 VARCHAR(20)

выход:

Msg 1934, Level 16, State 1, Procedure DDLEventLogging, Line 13 [Batch Start Line 4]
SELECT failed because the following SET options have incorrect settings: 'ANSI_PADDING'.

Секционированная таблица имеет множество типы данных в нем; UNIQUEIDENTIFIER, SMALLINT, MONEY, CHAR, VARCHAR.

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

ALTER TABLE SWITCH statement failed because column 
'COLUMNA' does not have the same ANSI trimming semantics 
in tables 'DB.SCHEMA.MAINTABLE' and 'DB.SCHEMA.STAGINGTABLE'.

Рок и трудное место.

Кроме создания новой таблицы с включенным ANSI_PADDING и загрузки в нее всех моих данных, есть ли у меня какие-либо другие варианты?

Большое спасибо

1 Ответ

0 голосов
/ 04 мая 2020

Извиняюсь. Мне неизвестно, есть триггер DDL в базе данных, который использует EVENTDATA () для захвата событий DDL. Это источник ошибки, а не сценарий управления разделами. Как предложил Дэн, я добавил SET ANSI_PADDING ON; в триггер, и задание по обслуживанию раздела завершается.

...