In primo luogo, creare una funzione rapida che dividere un elenco delimitato di valori in una tabella, come questo:
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
quindi chiamare il funzione come questa ...
SELECT *
FROM A
LEFT OUTER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value
WHERE f.Id IS NULL
Questo h come ha funzionato davvero bene sul nostro progetto ...
Naturalmente, si potrebbe anche fare il contrario, se così fosse (anche se non è la tua domanda).
SELECT *
FROM A
INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value
E questo è davvero utile quando si tratta di report che hanno una lista di parametri multi-selezione opzionale. Se il parametro è NULL, si desidera che tutti i valori siano selezionati, ma se ha uno o più valori si desidera che i dati del report vengano filtrati su tali valori. Quindi utilizzare SQL come questo:
SELECT *
FROM A
INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value OR @ExcludeList IS NULL
questo modo, se @ExcludeList è un valore NULL, la clausola OR nel join diventa un interruttore che disattiva il filtraggio da questo valore. Molto utile ...
@TomTom et al - Non sono d'accordo che questo è un duplicato. L'altra domanda riguarda più aspetti non correlati a ciò che questa domanda affronta nello specifico. Soprattutto, sono contento di aver trovato questo post e non l'altro - poiché questo risolveva il mio problema con precisione. – condiosluzverde