【发布时间】: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) on 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