SQL Server 2005 : Instruction Select en état ISNULL
J'ai un proc stocké qui reçoit un paramètre séparés par des virgules. J'ai écrit une fonction Table UDF valorisées dans SQL de le casser et et me retourner comme un tableau. J'utilise cette valeur pour filtrer les données dans l'où la clause de la proc stockée tout fonctionne bien jusqu'à ce qu'il y a la valeur NULL dans cette virgule séparées variable passée à la proc stockée. Je veux écrire mon où clause de telle sorte que si la variable passée est NULL alors elle ne doit pas utiliser la fonction Split. Voici ce que j'ai fais le proc stockée.
Declare @list varchar(100), @Col2 varchar(100)
SELECT *
FROM Table1 t1
INNER JOIN dbo.Table2 t2 ON t1.Col1 = t2.Col1
WHERE t1.Col2 = ISNULL(@Col2,t1.Col2)
--I want to write below condition the same way i have written the above condition
AND t1.Col3 IN (select * from dbo.SplitMe(@list))
Est-il possible d'écrire la condition pour sélectionner Col3 la façon Col2 est sélectionnée ?
répondre #1
Si l'idée n'est ne pas filtrer les
Col3
si @list
êtes null, puis vous pourrait faire la même façonDeclare @list varchar(100), @Col2 varchar(100)
SELECT *
FROM Table1 t1
INNER JOIN dbo.Table2 t2
on t1.Col1 = t2.Col1
where t1.Col2 = ISNULL(@Col2,t1.Col2)
AND (@list IS NULL OR t1.Col3 IN (select * from dbo.SplitMe(@list)))
mais il ne serait pas une bonne idée à moins que les tables sont très petites. Plan de mise en cache de raisons, il est généralement préférable de briser toutes ces permutations dans leur propre SQL déclarations plutôt que d'essayer et écrire une taille adapte tous les interroger ou (si le nombre de permutations grossit trop) envisager d'utiliser SQL dynamique (voir Les Conditions de recherche dynamique en T-SQL)
Notez cette garantie n'est pas que la fonction Split ne sera pas appelée. Il n'y a aucun ordre garanti de l'évaluation des clauses. Mais cela ne veut pas dire que si il appelé, il n'aura aucun effet sur les résultats de la requête. (Edit en supposant bien sûr qu'appelée quand
NULL
ne provoquent en fait une sorte de commentaire d'erreur c.f. Remus)répondre #2
Vous avez une requête avec maintenant deux variables qui sont indépendants les uns des autres. Y compris deux d'entre eux dans une seule requête produit une requête non sargable - la requête est très différente selon les valeurs des variables et que vous utilisez des expressions conditionnelles chers pour garder ensemble. C'est les deux d'une douleur à maintenir et donne de mauvais résultats.
Vous pouvez utiliser une instruction IF :
IF
BEGIN
SELECT *
FROM TABLE1 t1
JOIN TABLE2 t2 ON t2.col1 = t1.col1
WHERE t1.col1 = COALESCE(@col2, t1.col2)
END
ELSE
BEGIN
SELECT *
FROM TABLE1 t1
JOIN TABLE2 t2 ON t2.col1 = t1.col1
WHERE t1.col2 = COALESCE(@col2, t1.col2)
AND t1.col3 IN (SELECT * FROM dbo.splitme(@list))
END
.. .mais il y a encore le traitement null. Pour les deux variables, c'est quatre résultats de valeur possible. Des situations comme celles-ci sont ce que le SQL dynamique est destiné - à construire la requête nécessaire parce que trimballer des bagages ne fonctionne pas bien.
répondre #3
WHERE (t1.Col2 = @Col2 OR @Col2 IS NULL)
AND (t1.Col3 IN (select * from dbo.SplitMe(@list)) OR @list IS NULL)
0 commentaires:
Enregistrer un commentaire