2010-01-06 3 views
2

Je veux écrire une requête un peu comme ceci:UDF SQL dans WHERE

CREATE PROCEDURE DupFinder 
@FirstName varchar(20), 
@LastName varchar(20) 

AS 

SELECT CustId 
    FROM Cust c 
WHERE [dbo].[fn_MatchConfidence](@FirstName + ' ' + @LastName, 
            [dbo].fn_createCustHash (CustId)) > .8 

Exécution de la fonction définie par l'utilisateur fn_MatchCondifence (qui prend deux varchars et renvoie un nombre) sur l'ensemble de la table Cust. CreateCustHash crée simplement une chaîne de FirstName et LastName avec un espace au milieu.

Comment est-ce que je peux faire ceci?

+0

Et quelle erreur obtenez-vous exactement? –

Répondre

6

N'utilisez pas de fonction scalaire. Ils sont vraiment mauvais.

http://msmvps.com/blogs/robfarley/archive/2009/12/05/dangers-of-begin-and-end.aspx

Au lieu de cela, utilisez une table inline fonction.

+1

+1: Yep - index, parti sur la requête la plus externe. Probablement faire Dieu sait dedans ... –

+0

Pas que ... le problème est que la fonction sera exécutée dans un contexte différent. Regardez dans Profiler et vous verrez le moteur démarrer un contexte d'exécution différent pour chaque appel de fonction. –