D'abord, créer une fonction rapide qui va diviser une liste délimitée par des valeurs dans une table, comme ceci:
CREATE FUNCTION dbo.udf_SplitVariable
(
@List varchar(8000),
@SplitOn varchar(5) = ','
)
RETURNS @RtnValue TABLE
(
Id INT IDENTITY(1,1),
Value VARCHAR(8000)
)
AS
BEGIN
--Account for ticks
SET @List = (REPLACE(@List, '''', ''))
--Account for 'emptynull'
IF LTRIM(RTRIM(@List)) = 'emptynull'
BEGIN
SET @List = ''
END
--Loop through all of the items in the string and add records for each item
WHILE (CHARINDEX(@SplitOn,@List)>0)
BEGIN
INSERT INTO @RtnValue (value)
SELECT Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List)-1)))
SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn,@List) + LEN(@SplitOn), LEN(@List))
END
INSERT INTO @RtnValue (Value)
SELECT Value = LTRIM(RTRIM(@List))
RETURN
END
appellent ensuite le fonction comme ça ...
SELECT *
FROM A
LEFT OUTER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value
WHERE f.Id IS NULL
cette h comme a très bien fonctionné sur notre projet ...
Bien sûr, le contraire pourrait également être fait, si tel était le cas (mais pas votre question).
SELECT *
FROM A
INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value
Et cela est vraiment pratique lorsque vous traitez des rapports qui ont une liste de paramètres multi-sélection optionnelle. Si le paramètre est NULL, vous souhaitez que toutes les valeurs soient sélectionnées, mais si vous avez défini une ou plusieurs valeurs, vous souhaitez que les données du rapport soient filtrées sur ces valeurs. Ensuite, utilisez SQL comme ceci:
SELECT *
FROM A
INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value OR @ExcludeList IS NULL
De cette façon, si @ExcludeList est une valeur NULL, la clause OR dans la jointure devient un interrupteur qui désactive le filtrage sur cette valeur. Très pratique ...
@TomTom et al - Je suis en désaccord que c'est un doublon. L'autre question couvre plus de terrain non lié à ce que cette question aborde dans le spécifique. Plus important encore, je suis content d'avoir trouvé ce post et pas l'autre - car celui-ci a résolu mon problème avec précision. – condiosluzverde