2010-08-27 5 views
0

Je souhaite écrire une procédure stockée qui acceptera un paramètre de @searchString. Ce sera un varchar (100) et contiendra une valeur de requête. Comment puis-je écrire le sp afin qu'il puisse faire quelque chose comme:SQL 2005 - Chaîne de recherche

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE a.ApplicationId = @searchString 
OR app.Name like '@searchString%' 
OR app.PostCode like '@searchString%' 

Le problème pour moi est de savoir comment gérer le fait que le searchString peut contenir un identifiant qui sera un int ou pourrait être une valeur de chaîne.

+0

Avez-vous un moyen de transmettre quelque chose pour indiquer le champ contre lequel il devrait se trouver? Si oui, vous pouvez simplement utiliser une déclaration de cas dans le où. – spinon

+0

Mon plan était de faciliter l'interface utilisateur en ayant juste 1 chaîne de recherche qui pourrait être utilisée pour rechercher dans quelques champs clés –

Répondre

0

Je résolu ce problème en créant une autre variable locale et si le searchString était numérique, convertir et si pas alors à zéro (un id je sais ne sera pas exister).

declare @id int 
if ISNUMERIC(@searchString) = 1 
    set @id = CONVERT(int, @searchString) 
else 
    set @id = 0 

Alors where ressemble à:

WHERE 
    a.ApplicationId = @id 
    OR app.Surname like @searchString + '%' 
    OR app.Forenames like '%' + @searchString + '%' 
0

Vous pouvez mettre la sélection ensemble en tant que chaîne avec une citation appropriée, puis utiliser sp_executesql pour l'exécuter.

Mais sachez qu'il existe un potentiel d'injection SQL avec ceci!

0
You can check that searchString has only numbers by using PATINDEX and then only compare with applicationId 

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE (PATINDEX('%[^0-9]%', @searchString) = 0 AND a.ApplicationId = @searchString) 
OR app.Name like @searchString + '%' 
OR app.PostCode like '@searchString + '%' 
+0

Le problème avec ceci est que l'AND après PATINDEX n'est pas conditionnel provoque donc une erreur de conversion –

0

Qu'en est-il passer le proc stocké est un paramètre d'entrée XML? De cette façon, lorsque vous déballez le XML, vous pouvez contrôler les types de données et gérer les ID ou le texte, le cas échéant.

0
SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE a.ApplicationId = 
    case when ISNUMERIC(@searchString) 
    then 
    CONVERT(int, @searchString) 
    else 
    0 
    end 
OR app.Name like @searchString + '%' 
OR app.PostCode like @searchString + '%' 
0

Pourquoi ne pas simplement transformer votre int en chaîne?

SELECT * 
FROM Application a 
INNER JOIN Applicant app ON app.ApplicationId = a.ApplicationId 
WHERE cast(a.ApplicationId as varchar(100)) = @searchString 
OR cast(app.Name as varchar(100)) like '@searchString%' 
OR cast(app.PostCode as varchar(100)) like '@searchString%' 
Questions connexes