La définition dit:
Lorsque SET ANSI_NULLS a la valeur ON, une instruction SELECT qui utilise WHERE nom_colonne = NULL renvoie zéro ligne même s'il existe des valeurs nulles dans nom_colonne. Une instruction SELECT qui utilise WHERE nom_colonne <> NULL renvoie zéro ligne même s'il existe des valeurs non nulles dans nom_colonne.
Cela signifie-t-il qu'aucune valeur nulle ne sera incluse dans cette requête?
SELECT Region
FROM employees
WHERE Region = @region
Ou ANSI_NULL
s concerne-t-il uniquement des requêtes comme celle-ci (où WHERE
inclut le mot spécifique NULL
)?
SELECT Region
FROM employees
WHERE Region = NULL
sql
tsql
stored-procedures
Rodniko
la source
la source
Réponses:
Cela signifie qu'aucune ligne ne sera retournée si
@region
estNULL
, lorsqu'elle est utilisée dans votre premier exemple, même s'il y a des lignes dans la table oùRegion
estNULL
.Quand
ANSI_NULLS
est activé (ce que vous devriez toujours activer de toute façon, puisque l'option de ne pas l'activer va être supprimée à l'avenir), toute opération de comparaison où (au moins) l'un des opérandes estNULL
produit la troisième valeur logique -UNKNOWN
( par opposition àTRUE
etFALSE
).UNKNOWN
les valeurs se propagent à travers tout opérateur booléen combinant si elles ne sont pas déjà décidées (par exempleAND
avec unFALSE
opérande ouOR
avec unTRUE
opérande) ou des négations (NOT
).La
WHERE
clause est utilisée pour filtrer le jeu de résultats produit par laFROM
clause, de sorte que la valeur globale de laWHERE
clause doit êtreTRUE
pour que la ligne ne soit pas filtrée. Ainsi, si unUNKNOWN
est produit par une comparaison, cela entraînera le filtrage de la ligne.La réponse de @ user1227804 comprend cette citation:
à partir de *
SET ANSI_NULLS
Cependant, je ne sais pas sur quel point il essaie de faire valoir, car si deux
NULL
colonnes sont comparées (par exemple en aJOIN
), la comparaison échoue toujours:create table #T1 ( ID int not null, Val1 varchar(10) null ) insert into #T1(ID,Val1) select 1,null create table #T2 ( ID int not null, Val1 varchar(10) null ) insert into #T2(ID,Val1) select 1,null select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1
La requête ci-dessus renvoie 0 ligne, alors que:
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)
Renvoie une ligne. Donc, même lorsque les deux opérandes sont des colonnes, cela
NULL
n'est pas égalNULL
. Et la documentation de=
n'a rien à dire sur les opérandes:Cependant, 1 et 2 sont incorrects - le résultat des deux comparaisons est
UNKNOWN
.* La signification cryptique de ce texte a finalement été découverte des années plus tard. Cela signifie en fait que, pour ces comparaisons, le paramètre n'a aucun effet et agit toujours comme si le paramètre était activé . Cela aurait été plus clair s'il avait déclaré que
SET ANSI_NULLS OFF
c'était le paramètre qui n'avait aucun effet.la source
Si ce
@Region
n'est pas unenull
valeur (disons@Region = 'South'
), il ne retournera pas les lignes où le champ Region est nul, quelle que soit la valeur de ANSI_NULLS.ANSI_NULLS ne fera une différence que lorsque la valeur de
@Region
estnull
, c'est-à-dire lorsque votre première requête devient essentiellement la seconde.Dans ce cas, ANSI_NULLS ON ne retournera aucune ligne (car
null = null
produira une valeur booléenne inconnue (akanull
)) et ANSI_NULLS OFF renverra toutes les lignes où le champ Region est nul (carnull = null
donneratrue
)la source
Si ANSI_NULLS est défini sur "ON" et si nous appliquons =, <> sur la valeur de colonne NULL lors de l'écriture de l'instruction select, il ne renverra aucun résultat.
Exemple
create table #tempTable (sn int, ename varchar(50)) insert into #tempTable values (1, 'Manoj'), (2, 'Pankaj'), (3, NULL), (4, 'Lokesh'), (5, 'Gopal')
SET ANSI_NULLS ON
select * from #tempTable where ename is NULL -- (1 row(s) affected) select * from #tempTable where ename = NULL -- (0 row(s) affected) select * from #tempTable where ename is not NULL -- (4 row(s) affected) select * from #tempTable where ename <> NULL -- (0 row(s) affected)
SET ANSI_NULLS OFF
select * from #tempTable where ename is NULL -- (1 row(s) affected) select * from #tempTable where ename = NULL -- (1 row(s) affected) select * from #tempTable where ename is not NULL -- (4 row(s) affected) select * from #tempTable where ename <> NULL -- (4 row(s) affected)
la source
WHERE X IS NULL
etWHERE X = NULL
et comment ANSI_NULLS affecte le résultat. Malgré les tentatives trop zélées des électeurs à la baisse, CECI devrait être la réponse acceptée!SET ANSI_NULLS ON
IT Renvoie toutes les valeurs, y compris les valeurs nulles dans la table
SET ANSI_NULLS désactivé
il se termine lorsque les colonnes contiennent des valeurs nulles
la source
Je suppose que l'essentiel ici est:
Jamais utilisateur:
@anything = NULL
@anything <> NULL
@anything != null
Utilisez toujours:
@anything IS NULL
@anything IS NOT NULL
la source
Définir ANSI NULLS OFF rendra la comparaison NULL = NULL vraie. PAR EXEMPLE :
SET ANSI_NULLS OFF select * from sys.tables where principal_id = Null
renvoie un résultat comme indiqué ci-dessous: zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPermissions 2840564 NULL ZCWOrgLevelClientFee 4322525 NULL
Bien que cette requête ne renvoie aucun résultat:
SET ANSI_NULLS ON select * from sys.tables where principal_id = Null
la source
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql
Lorsque SET ANSI_NULLS a la valeur ON, une instruction SELECT qui utilise WHERE nom_colonne = NULL renvoie zéro ligne même s'il existe des valeurs nulles dans nom_colonne. Une instruction SELECT qui utilise WHERE nom_colonne <> NULL renvoie zéro ligne même s'il n'y a pas de valeurs nulles dans nom_colonne.
Pour par exemple
DECLARE @TempVariable VARCHAR(10) SET @TempVariable = NULL SET ANSI_NULLS ON SELECT 'NO ROWS IF SET ANSI_NULLS ON' where @TempVariable = NULL -- IF ANSI_NULLS ON , RETURNS ZERO ROWS SET ANSI_NULLS OFF SELECT 'THERE WILL BE A ROW IF ANSI_NULLS OFF' where @TempVariable =NULL -- IF ANSI_NULLS OFF , THERE WILL BE ROW !
la source