如何在update语句中调用函数

时间:2017-03-10 18:36:23

标签: tsql

我可以获得传递字符串的函数的第一个,中间名,姓氏。如何将查询中的元素传递给更新语句的函数。

- 测试更新逻辑和名称解析

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

1 个答案:

答案 0 :(得分:0)

我认为你的意思是做类似的事情:

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'
;

我不知道你用什么来解析名字,但我可以看到它总是返回名字,中间名和姓氏。您可能需要考虑向函数添加额外的输入参数,以便您可以通过输入数字(或其他)参数来专门请求名字,中间名或姓氏。

在上面的查询中,每个名称都会返回重复的结果,因此您可能最终会针对相同的值运行UPDATE几次,每次都使用相同的值。

通过向您的函数添加其他参数,您可以多次使用CROSS APPLY(或OUTER APPLY,如果有可能缺少一个或多个标记),以便更有效地更新,就这样:

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'
;