我有一个开发人员要求将默认的ANSI填充从ON更改为OFF。当然,我最初的回答是否定的,你为什么要这么做.
“我不希望在NVARCHAR、NCHAR列上使用尾随空格。根据文档(下面的链接),在创建列后不能更改设置。此外,它还表示,默认情况下,NVARCHAR / NCHAR列的设置总是打开的,您必须显式地设置它。
我使用'N‘类型的原因是为了使应用程序unicode兼容。
我们是否可以全局设置它,以便在创建新表时不必担心显式设置它?
这是一个问题,也是为什么:填充是开着的,我得到了不想要的尾随空间。由于HTML不考虑unicode长度,额外的空格会影响前端验证。“
部分问题是来源数据是由互联网网站的分析师下载的,目前我们还没有良好的数据质量验证协议,这超出了本文的范围。
还有人要处理这件事吗?如果是这样的话,您是否可以提供不涉及重写proc和函数的替代选项。
这些是Server 2017实例和数据库。
任何建议或链接到文章将不胜感激。
发布于 2020-09-03 14:54:43
填充物中的一个注释是:
ANSI_PADDING应该始终设置为ON。
这几乎没有讨论的余地。更重要的是,从同样的链接:
SET ANSI_PADDING设置不影响nchar、nvarchar、ntext、text、image、var二进制(Max)、varchar(max)和nvarchar(max)数据类型。他们总是在行为上显示集合ANSI_PADDING。这意味着尾随空格和零不会被修剪。
如果更改现有代码库不可行,您可以做的是在感兴趣的列上使用触发器。如果需要的话,设置触发器的尾随空间。
发布于 2020-09-03 15:35:40
我们是否可以全局设置它,以便在创建新表时不必担心显式设置它?
这是一个会话设置,用户可以随意更改它。
当ansi_padding关闭数据库触发器时,您可以防止/回滚表的创建和更改。
--a bit too strict for tables that do not contain char/binary columns
create or alter trigger ansi_padding_must_be_on
on database
for CREATE_TABLE, ALTER_TABLE
as
begin
--when ansi_padding off, rollback the table creation/alteration
if SESSIONPROPERTY ('ANSI_PADDING') = 0 -- (16 & @@options) <> 16
begin
raiserror(N'ANSI_PADDING must be ON;', 16, 1);
rollback;
end
end
如果是这样的话,您是否可以提供不涉及重写proc和函数的替代选项。
您可以安排一个作业,以更新和rtrims每个%varchar%列,直到适当的质量控制到位。
https://stackoverflow.com/questions/63724757
复制相似问题