Désolé pour le long courrier, mais la majeure partie est un code épelant mon scénario:dynamique de requêtes SQL (entrées variables, et les entrées variables par colonne)
Je suis en train d'exécuter une requête dynamique (je l'espère par une procédure stockée) pour extraire les résultats en fonction d'un nombre variable d'entrées.
Si j'avais une table:
(dbo).(People)
ID Name Age
1 Joe 28
2 Bob 32
3 Alan 26
4 Joe 27
Je veux permettre à l'utilisateur de rechercher par l'une des trois colonnes, pas de problème:
DECLARE @ID int, @Name nvarchar(25), @Age int
SET @ID = 1
SET @Name = 'Joe'
SET @Age = null
SELECT *
FROM dbo.People
WHERE
(ID = @ID or @ID is null) AND
(Name like @Name or @Name is null) AND
(Age = @Age or @Age is null)
Et je récupère le résultat que je veux .
Maintenant, si je veux rechercher plusieurs champs dans une colonne, je peux le faire sans problème:
DECLARE @text nvarchar(100)
SET @text = '1, 3'
DECLARE @ids AS TABLE (n int NOT NULL PRIMARY KEY)
--//parse the string into a table
DECLARE @TempString nvarchar(300), @Pos int
SET @text = LTRIM(RTRIM(@text))+ ','
SET @Pos = CHARINDEX(',', @text, 1)
IF REPLACE(@text, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @TempString = LTRIM(RTRIM(LEFT(@text, @Pos - 1)))
IF @TempString <> '' --just: IF @TempString != ''
BEGIN
INSERT INTO @ids VALUES (@TempString)
END
SET @text = RIGHT(@text, LEN(@text) - @Pos)
SET @Pos = CHARINDEX(',', @text, 1)
END
END
SELECT *
FROM dbo.People
WHERE
ID IN (SELECT n FROM @ids)
Maintenant, mon problème est que je ne peux pas sembler comprendre comment combiner les deux puisque je ne peux pas mettre:
WHERE
(Name like @Name or @Name is null) AND
(Id IN (SELECT n FROM @ids) or @ids is null)
Parce que @ids ne sera jamais nulle (car il est une table)
Toute aide serait grandement appréciée!
Merci à l'avance ... et laissez-moi savoir si je peux préciser quoi que ce soit
IIRC, pas [sargable] (http://en.wikipedia.org/wiki/Sargable) –
Merci pour l'aide, c'est la solution dont j'avais besoin. mais actuellement, ma table est assez petite et avec le temps ça va grandir, et assez rapidement, donc je me demande à quel point cela va affecter la performance ...? – Brett
@Brett - Je suis avec OMG Ponies sur l'approche globale. C'est simplement la réponse la plus courte et la plus simple en accord avec votre approche. J'ai décidé de ne pas faire de refactoring, mais généralement le plan d'exécution pour la recherche "unifiée" n'est pas bon, et il vaut mieux dérouler les conditions "manuellement" afin d'obtenir les meilleurs plans d'exécution pour chaque option. Quand il y a des combinaisons complexes, générer du code dynamiquement pour que ce soit exactement ce qui est nécessaire est finalement le plus efficace. C'est un peu plus un défi dans votre cas à cause des listes au lieu de paramètres uniques. –