如何使用insert通过用户定义的函数交叉应用来更新另一个表中的列

时间:2017-03-12 23:35:41

标签: tsql

更新似乎正在运行,但我还需要使用解析名称函数插入。

- 似乎正在运行的更新功能

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-ENR'
AND P.PEOPLE_ID = C.KEY4

如何在插入查询中使用该函数。这是我到目前为止所尝试的。显示错误。 “十字架附近的语法不正确”

INSERT INTO       SISUnitTest.dbo.PEOPLE p (p.LAST_NAME, p.FIRST_NAME, p.LAST_NAME)
SELECT           T.ForeName, T.Middle_Name, T.Surnname
FROM             CONTACT1 c
WHERE        (c.KEY1 = p.PEOPLE_ID);
CROSS APPLY dbo.NameParser(c.Contact) T
WHERE p.PEOPLE_ID = c.KEY4

2 个答案:

答案 0 :(得分:0)

您附近有语法错误:

INSERT INTO       SISUnitTest.dbo.PEOPLE p (p.LAST_NAME, p.FIRST_NAME, p.LAST_NAME)
SELECT           T.ForeName, T.Middle_Name, T.Surnname
FROM             CONTACT1 c
WHERE        (c.KEY1 = p.PEOPLE_ID); //right here
CROSS APPLY dbo.NameParser(c.Contact) T
WHERE p.PEOPLE_ID = c.KEY4

从此处删除分号:(c.KEY1 = p.PEOPLE_ID);< - 此分号

答案 1 :(得分:0)

ERPise。

这里你实际上有很多语法错误,以及似乎是一种误解。

首先,您的查询有两个WHERE子句:

FROM             CONTACT1 c
WHERE        (c.KEY1 = p.PEOPLE_ID); --1
CROSS APPLY dbo.NameParser(c.Contact) T
WHERE p.PEOPLE_ID = c.KEY4 --2

EAK TEAM也是正确的分叉给你带来麻烦;那是你原来的错误信息。

除此之外,您正在执行INSERTSISUnitTest.dbo.People,您已将尝试别名为P;但重复的WHERE条款中的连接条件似乎是一个简单的副本&从原始更新查询中的表格粘贴PCUnitTest.dbo.People AS P,所以我想知道这些条件是否可能不再合适。 SISUnitTest.dbo.People是否与PCUnitTest.dbo.People具有相同的字段?

如果你想要的是从PCUnitTest.dbo.PeopleGMUnitTest.dbo.Contact1插入SISUnitTest.dbo.People,那么这是可能的,但你必须将你的查询重组为这样的事情(你原来的几行已被注释掉,因为它们似乎有错误):

--INSERT INTO SISUnitTest.dbo.PEOPLE p (p.LAST_NAME, p.FIRST_NAME, p.LAST_NAME)
INSERT INTO SISUnitTest.dbo.People (First_Name,Middle_Name,Last_Name)
SELECT
     T.ForeName
    ,T.Middle_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-ENR'
;
--AND P.PEOPLE_ID = C.KEY4
--This condition is already included in the INNER JOIN three lines up

值得注意的是,在这种格式下,INNER JOIN几乎无用,除非您使用它来检查PCUnitTest.dbo.PeopleGMUnitTest.dbo.Contact1中是否存在相同的列表。如果这无关紧要,那么您只需从此查询中删除INNER JOIN即可。

同样,我想提醒你的dbo.NameParser()函数似乎总是返回三行(ForeName,Middle_Name,Surname)。如果是这种情况,并且如果在INSERT语句中使用它,则很可能会为您解析的每个名称插入三行。

正如我之前的回答中所建议的那样,您可能需要考虑向dbo.NameParser添加第二个参数,以便您可以请求名称的特定部分。这将允许您插入一行。

我建议您只运行上述查询的SELECT部分,而不使用INSERT查看几个随机条目上返回的内容。我希望你能看到我在说什么。