2017-03-10 9 views
0

Ich kann den ersten, mittleren, letzten Namen für eine Funktion, die eine Zeichenfolge übergeben. Wie übergebe ich das Element in der Abfrage an die Funktion für eine Update-Anweisung.So rufen Sie Funktion in update-Anweisung

--test Update-Logik und den Namen Parsen

USE PCUnitTest 
UPDATE p 
SET --Need FIRST_NAME, MIDDLE_NAME, LAST_NAME 
     p.FIRST_NAME = SELECT forename FROM (SELECT * FROM dbo.NameParser(c.CONTACT)) AS FirstName, --shows multipart identifier could not be bound 
     p.FIRST_NAME = SELECT forename FROM (SELECT * FROM dbo.NameParser('Andy D Where')) AS FirstName, --returns Andy 
     p.MIDDLE_NAME = SELECT middle_name FROM (SELECT * FROM dbo.NameParser('Andy D Where')) AS MiddleName, --returns D 
     p.LAST_NAME = SELECT surname FROM (SELECT * FROM dbo.NameParser('Andy D Where')) AS LastName --returns Where 

FROM GMUnitTest.dbo.CONTACT1 c 
     JOIN PCUnitTest.dbo.PEOPLE p 
     ON p.PEOPLE_ID = c.KEY4 
     WHERE c.Key1 = '76'; --Test with a current string 
GO 

Antwort

0

Ich glaube, Sie etwas Ähnliches wie dies zu tun bedeuten:

USE PCUnitTest 
GO 

UPDATE P 
SET 
    P.First_Name = T.ForeName 
    ,P.Middle_Name = T.Middle_Name 
    ,P.Last_name = T.Surname 
FROM GMUnitTest.dbo.Contact1 C 
INNER JOIN PCUnitTest.dbo.People P 
    ON P.People_ID = C.Key4 
CROSS APPLY dbo.NameParser(C.Contact) T 
WHERE C.Key1 = '76' 
; 

Ich weiß nicht, was Sie zu analysieren, verwenden die Namen, aber ich kann sehen, dass es immer den Vornamen, den zweiten Vornamen und den Nachnamen zurückgibt. Sie sollten in Erwägung ziehen, einen zusätzlichen Eingabeparameter zu Ihrer Funktion hinzuzufügen, damit Sie den ersten, mittleren oder letzten Namen durch Eingabe eines numerischen (oder anderen) Parameters spezifisch anfordern können.

In der Abfrage oben, jeder Name würde doppelte Ergebnisse zurückgeben, so würden Sie wahrscheinlich am Ende eine UPDATE gegen den gleichen Wert ein paar Mal ausgeführt, jedes Mal mit dem gleichen Wert.

Durch einen weiteren Parameter an Ihre Funktion hinzufügen, könnten Sie CROSS APPLY mehrmals (oder OUTER APPLY, wenn es eine Chance, dass ein oder mehrere Moniker fehlen), um effizienter zu aktualisieren, als solche:

USE PCUnitTest 
GO 

UPDATE P 
SET 
    P.First_Name = FirstName.ForeName 
    ,P.Middle_Name = MiddleName.Middle_Name 
    ,P.Last_name = LastName.Surname 
FROM GMUnitTest.dbo.Contact1 C 
INNER JOIN PCUnitTest.dbo.People P 
    ON P.People_ID = C.Key4 
CROSS APPLY dbo.NameParser(C.Contact,1) FirstName 
CROSS APPLY dbo.NameParser(C.Contact,2) MiddleName 
CROSS APPLY dbo.NameParser(C.Contact,3) LastName 

WHERE C.Key1 = '76' 
; 
+0

Dank benutze ich die JStyons. Sie müssen also einer Tabelle beitreten, und Sie können keine Funktion in den Ausdruck setzen. Ich muss nur herausfinden, wie ich es addieren kann, um Suffixe wie Jr.Sr. zu erhalten. Ich habe das gesehen, das Eingabeparameter verwendet, ich werde es auch versuchen. – ERPISE

+0

auch, das ist für einen Trigger, für einfügen nach, wenn ich referenziere die eingefügte Tabelle, die in der Dropdown-Liste intelliscence zeigt, wenn ich eingabed, bekomme ich den Fehler, "die Multipart-Kennung" insert.contact "konnte nicht gebunden werden" . Irgendeine Idee, wie man die eingefügte Tabelle für einen Auslöser referenziert? USE PCUnitTest GO UPDATE P SET P.First_Name = T.ForeName , P.Middle_Name = T.Middle_Name , P.Last_name = T.Surname FROM GMUnitTest.dbo.Contact1 C INNER JOIN PCUnitTest .dbo.Personen P ON P.People_ID = C.Key4 CROSS APPLY dbo.NameParser (eingefügter.Kontakt) T WHERE C.Key1 = '76' ; – ERPISE

+0

Es gibt kein Problem, die "Eingeschaltete" Tabelle in einem "TRIGGER" zu referenzieren. Sie müssen es nur in die FROM-Klausel Ihrer Abfrage einfügen. Wenn Sie bestimmte Probleme damit haben, würde ich empfehlen, Ihre ursprüngliche Frage mit der echten Abfrage zu aktualisieren, die Sie ausführen möchten, oder eine neue Frage basierend auf dem Problem zu stellen, das Sie haben. – 3BK

Verwandte Themen