Posted by OFPPT
No comments | 08:25
SQL server






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çon
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)
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