J'ai un développeur qui demande de changer le rembourrage ANSI par défaut de ON à OFF. Bien sûr, ma réponse initiale était NON et pourquoi voudriez-vous faire cela ...

"Je ne veux pas d'espaces de fin sur les colonnes NVARCHAR, NCHAR. D'après la documentation (liens ci-dessous), le paramètre ne peut pas être modifié après la création d'une colonne. De plus, il indique que le paramètre est toujours activé par défaut pour les colonnes NVARCHAR / NCHAR et vous devez le définir explicitement.

La raison pour laquelle j'utilise les types «N» est de rendre l'application compatible Unicode.

Pouvons-nous le définir globalement de sorte que lorsque nous créons de nouvelles tables, je n'ai pas à me soucier de le définir explicitement?

Voici le problème et pourquoi: Le remplissage est activé et j'obtiens des espaces de fin indésirables. Les espaces supplémentaires gâchent la validation frontale car HTML ne tient pas compte des longueurs Unicode. "

Une partie du problème est que les données sont téléchargées par les analystes à partir de sites Internet et actuellement, nous n'avons pas de bons protocoles de validation de la qualité des données, ce qui va au-delà de ce poste.

Quelqu'un d'autre a-t-il eu à gérer cela? Si tel est le cas, pouvez-vous fournir des options alternatives qui n'impliquent pas de réécriture de proc et de fonctions.

Il s'agit d'instances et de bases de données SQL Server 2017.

Toutes suggestions ou liens vers des articles sont appréciés.

1
NC3 3 sept. 2020 à 16:31

2 réponses

Meilleure réponse

Une note dans la La documentation SQL Server sur ANSI_PADDING contient:

ANSI_PADDING doit toujours être défini sur ON.

Cela laisse peu de place à la discussion. Plus important encore, à partir du même lien:

Le paramètre SET ANSI_PADDING n'affecte pas les types de données nchar, nvarchar, ntext, text, image, varbinary (max), varchar (max) et nvarchar (max). Ils affichent toujours le comportement SET ANSI_PADDING ON. Cela signifie que les espaces de fin et les zéros ne sont pas coupés.

Ce que vous pouvez faire, si la modification de la base de code existante n'est pas possible, est de travailler avec des déclencheurs sur les colonnes d'intérêt. Demandez au (x) déclencheur (s) de couper les espaces de fin si nécessaire.

0
TT. 3 sept. 2020 à 14:54

Pouvons-nous le définir globalement de sorte que lorsque nous créons de nouvelles tables, je n'ai pas à me soucier de le définir explicitement?

C'est un paramètre de session, l'utilisateur peut le modifier à volonté.

Vous pouvez empêcher / annuler la création et les modifications de tables lorsque ansi_padding est désactivé avec un déclencheur de base de données.

--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

Si tel est le cas, pouvez-vous fournir des options alternatives qui n'impliquent pas de réécriture de proc et de fonctions.

Vous pouvez planifier un travail qui met à jour et ajuste chaque colonne% varchar% jusqu'à ce que les contrôles de qualité appropriés soient en place.

0
lptr 3 sept. 2020 à 15:35