= (Comparaison ou affectation de chaînes)
S’applique à : SQL Server Base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Point de terminaison d'analyse SQL dans Microsoft Fabric Entrepôt dans Microsoft Fabric Base de données SQL dans Microsoft Fabric
Compare deux chaînes dans une clause WHERE
ou HAVING
, ou définit une variable ou une colonne sur une chaîne ou le résultat d’une opération de chaîne sur le côté droit de l’équation. Par exemple, si une variable @x
est égale à 'Adventure'
, WHERE @x = 'Adventure'
compare si la valeur d’origine de @x
est égale à la valeur de chaîne 'Adventure'
exacte. Vous pouvez également utiliser l’opérateur =
comme opérateur d’affectation. Vous pouvez, par exemple, appeler SET @a = 'AdventureWorks'
.
Syntaxe
expression = expression
Arguments
expression
Spécifie toute Expression valide de tout type de données dans la catégorie caractères et binaire, à l’exception des types de données image, ntext ou text. Les deux expressions doivent être de même type de données, ou l'une des expressions doit pouvoir être implicitement convertie dans le type de données de l'autre expression.
Pour comparer ou affecter des chaînes binaires et tout caractère compris entre ces chaînes, il faut utiliser une conversion explicite en données de type caractère avec CONVERT
ou CAST
.
Notes
La comparaison de chaînes à l’aide de l’opérateur =
suppose que les deux chaînes sont identiques. Pour les options de comparaison de chaînes partielles, reportez-vous à l’opérateur LIKE ou aux prédicats de texte intégral CONTAINS et CONTAINSTABLE.
Le moteur de base de données SQL Server suit la spécification ANSI/ISO SQL-92 (Section 8.2, Prédicat de comparaison, Règles générales #3) sur la façon de comparer des chaînes avec des espaces. La norme ANSI nécessite un remplissage pour les chaînes de caractères utilisées dans les comparaisons afin que leurs longueurs correspondent avant de les comparer. Le remplissage affecte directement la sémantique des prédicats de clause WHERE
et HAVING
et d’autres comparaisons de chaînes Transact-SQL. Par exemple, Transact-SQL considère que les chaînes 'abc'
et 'abc '
sont équivalentes pour la plupart des opérations de comparaison. La seule exception à cette règle est le prédicat LIKE. Lorsque le côté droit d’une expression de prédicat LIKE
présente une valeur avec un espace de fin, le moteur de base de données ne remplit pas les deux valeurs à la même longueur avant que la comparaison se produise. Étant donné que l’objectif du prédicat LIKE
, par définition, est de faciliter les recherches de modèles plutôt que les tests d’égalité de chaîne simples, ce prédicat n’enfreint pas la section de la spécification ANSI SQL-92 mentionnée précédemment.
Le paramètre SET ANSI_PADDING
n’affecte pas le remplissage ou non des chaînes par le moteur de base de données avant de les comparer. SET ANSI_PADDING
affecte uniquement la suppression ou non des espaces vides de fin des valeurs insérées dans une table ; il affecte donc le stockage, mais pas les comparaisons.
Exemples
R. Comparer des chaînes dans une clause WHERE
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName = 'Johnson';
B. Comparer des chaînes dans une clause WHERE à l’aide d’une conversion à partir d’un fichier binaire
DECLARE @LNameBin BINARY (100) = 0x5A68656E67;
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName = CONVERT(VARCHAR, @LNameBin);
C. Attribution de chaîne à une variable
Cet exemple illustre une affectation simple de données de chaîne à une variable à l’aide de l’opérateur =.
DECLARE @dbname VARCHAR(100);
SET @dbname = 'Adventure';
D. Comparaison de chaînes avec des espaces
Les requêtes suivantes illustrent la comparaison entre des chaînes où un côté contient des espaces et l’autre non :
CREATE TABLE #tmp (c1 VARCHAR(10));
GO
INSERT INTO #tmp VALUES ('abc ');
INSERT INTO #tmp VALUES ('abc');
GO
SELECT DATALENGTH(c1) AS 'EqualWithSpace', * FROM #tmp
WHERE c1 = 'abc ';
SELECT DATALENGTH(c1) AS 'EqualNoSpace ', * FROM #tmp
WHERE c1 = 'abc';
SELECT DATALENGTH(c1) AS 'GTWithSpace ', * FROM #tmp
WHERE c1 > 'ab ';
SELECT DATALENGTH(c1) AS 'GTNoSpace ', * FROM #tmp
WHERE c1 > 'ab';
SELECT DATALENGTH(c1) AS 'LTWithSpace ', * FROM #tmp
WHERE c1 < 'abd ';
SELECT DATALENGTH(c1) AS 'LTNoSpace ', * FROM #tmp
WHERE c1 < 'abd';
SELECT DATALENGTH(c1) AS 'LikeWithSpace ', * FROM #tmp
WHERE c1 LIKE 'abc %';
SELECT DATALENGTH(c1) AS 'LikeNoSpace ', * FROM #tmp
WHERE c1 LIKE 'abc%';
GO
DROP TABLE #tmp;
GO