2009-12-07 6 views
0

Je suis nouveau ici, et relativement nouveau pour les procédures stockées, alors s'il vous plaît faites-moi confiance! J'ai vérifié les questions connexes ici et ne trouve rien qui fonctionne dans ce cas.Instructions imbriquées dans la procédure stockée SQL Server Instruction SELECT

J'essaye de construire une procédure stockée (MS SQL Server 2005) qui prend un certain nombre de valeurs passées et en fait construit dynamiquement le SQL comme vous le feriez avec le SQL inline.

C'est là que je suis venu décoller.

Nous avons (un peu simplifié pour plus de clarté):

@searchf1 varchar(100), -- search filter 1 
@searchr1 varchar(100), -- search result 1 
@searchf2 varchar(100), -- search filter 2 
@searchr2 varchar(100), -- search result 2 
@direction char(1), -- direction to order results in 
AS 

set nocount on 
set dateformat dmy 

SELECT * 
    FROM database.dbo.table T 
WHERE T.deleted = 'n' 
ORDER BY CASE @direction 
      WHEN 'A' THEN T.id 
      WHEN 'D' THEN T.id DESC 
     END 

END 

set nocount off 

J'ai aussi essayé les lignes de ORDER BY que:

IF @direction = 'N' THEN 
    ORDER BY 
      T.id 
ELSE 
    ORDER BY 
      T.id DESC 

Les deux approches me donnent une erreur le long des lignes:

"Syntaxe incorrecte près du mot clé 'DESC'." (qui fait référence à la ligne id DESC après la commande ORDER BY

Dans le cadre de cette procédure stockée, je souhaite également essayer d'alimenter des paires de valeurs correspondant à un champ à consulter et un champ correspondant à celui-ci. pourrait être soit présent ou « » pour ce faire, je dois ajouter dans le code de la section SELECT similaire à:.

WHERE 
    deleted = 'n' 
    IF @searchf1 <> '' THEN 
     AND fieldf1 = @searchf1 AND fieldr1 = @searchr1 

Cela génère cependant des erreurs comme:

syntaxe incorrecte près du mot-clé «SI »

Je connais le SQL dynamique de ce le type n'est pas le plus élégant. Et je sais que je pourrais le faire avec des instructions IF ELSE glocal, mais si je le faisais, le SP aurait des milliers de lignes; il y aura jusqu'à 15 paires de ces champs de recherche, avec la direction et le champ pour ordonner cette direction.

(la version actuelle de ce SP utilise un passé dans la liste des ID de rendement généré par une SQL dynamique en ligne, à travers ce faisant, je suis en train de le réduire à un coup pour générer le recordset)

Tous aide grandement appréciée. J'ai énormément simplifié le code dans l'exemple ci-dessus pour plus de clarté, car c'est le concept général d'une instruction IF imbriquée avec SELECT et ORDER BY dont je me suis informé.

+0

S'il vous plaît utiliser le code de démarquage, pas HTML, lors du formatage du code. Voir: http://stackoverflow.com/editing-help –

Répondre

2

Pour cela, je voudrais essayer d'aller avec une solution SQL dynamique plus formelle, quelque chose comme ce qui suit, compte tenu de votre entrée défini des paramètres

DECLARE @SQL VARCHAR(MAX) 

SET @SQL = ' 
SELECT 

FROM 
    database.dbo.table T 
WHERE 
    T.deleted = ''n'' ' 

--Do your conditional stuff here 
IF @searchf1 <> '' THEN 
    SET @SQL = @SQL + ' AND fieldf1 = ' + @searchf1 + ' AND fieldr1 = ' + @searchr1 + ''' ' 

--Finish the query 
SET @SQL = @SQL + ' ORDER BY xxx' 

EXEC(@SQL) 

AVERTISSEMENT: L'utilisation de SQL dynamique n'est pas quelque chose Cela devrait être pris à la légère, et une attention particulière devrait être prise dans TOUTES les circonstances pour s'assurer que vous n'êtes pas ouvert aux attaques par injection SQL, cependant, pour certaines opérations de type recherche dynamique, il est l'un des plus élégants.

0

Une autre option que vous pourriez avoir, en fonction du type de données de votre champ, si les valeurs NULL ne sont pas permises, serait de faire quelque chose comme ceci.

SELECT * Extrait du fichier database.dbo.table T WHERE T.supprimé = 'n' ET fieldf1 = COALESCE (@ searchf1, fieldf1) ET fieldr1 = COALESCE (@ searchr1, fieldr1) --ETC ORDER BY fieldf1

De cette façon, vous ne l'utilisez SQL dynamique et il est assez lisible, il suffit d'avoir la variable nulle quand vous cherchez à omettre les données.

REMARQUE: Comme je l'ai mentionné cette route ne fonctionnera pas si l'une des colonnes de COALESCE contiennent des valeurs nulles.

+0

Merci Mitchel. Malheureusement, je recherche dans une colonne qui contient des valeurs nulles. Apprécier l'entrée de toute façon et je vais enregistrer cela pour référence future où la base de données ne contient pas un héritage de valeurs nulles. –

Questions connexes