【问题标题】:ANSI_PADDING and Partition SwitchingANSI_PADDING 和分区切换
【发布时间】:2020-05-04 09:30:27
【问题描述】:

我正在将多个本地 SQL Server 2008R2 企业版实例迁移到 AWS。新的 SQL Server 是托管在 EC2 实例上的 2017 Enterprise Edition。

目前,在我们的 SQL Server 2008R2 中,一些较大的表被分区(按日期)。我有一个分区管理脚本,它在每个月的第一天创建一个新分区并切换出最旧的分区。这工作正常。但是,分区表中的许多列是在 ANSI_PADDING OFF 的情况下创建的。当分区管理进程运行时,它会创建一个临时表,然后迭代地将新列添加到临时表中,根据源表列设置设置 ANSI_PADDING。该临时表随后在分区切换中使用。代码 sn -p 如下@

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) Sep 13 2019 15:49:57 版权所有 (C) 2017 Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows Server 2016 年数据中心 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 的新表并将我的所有数据注入其中之外,我还有其他选择吗?

非常感谢

【问题讨论】:

  • 您究竟是什么时候收到不正确的设置错误?在将新列添加到临时表时,我不会想到会出现错误,但可能会在稍后添加过滤索引等时出现错误。人。确保在为后续操作添加列后将会话设置设置回ANSI_NULLS ON
  • 嗨@DanGuzman,在添加第一列以针对它设置 ANSI_PADDING OFF 时立即出现错误。我用一个简单的例子更新了问题
  • 您添加的代码 sn-p 没有出现错误。我怀疑还有其他事情发生。
  • 嗨@DanGuzman 感谢您抽出宝贵时间查看。我刚刚在捕获事件数据的数据库上找到了一个 DDL 触发器。这是错误的原因,而不是我发布的脚本。
  • 您应该可以将SET ANSI_PADDING ON; 添加到 DDL 触发器中,然后就可以使用了。触发完成后,该设置将恢复为会话设置。

标签: sql sql-server data-partitioning


【解决方案1】:

抱歉。我不知道,数据库上有一个 DDL 触发器,它使用 EVENTDATA() 来捕获 DDL 事件。这是错误的来源,而不是分区管理脚本。 正如 Dan 建议的那样,我在触发器中添加了 SET ANSI_PADDING ON;,并且分区维护作业运行完成。

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 2019-03-13
    • 1970-01-01
    • 2015-02-11
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多