如何使用插入物从另一个表中使用用户定义的函数交叉应用



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

- 似乎有效的更新功能

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

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团队对半彩色给您带来麻烦也是正确的。那是您最初的错误消息。

除此之外,您还将INSERT执行到SISUnitTest.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

再次,我想 warcution 您的dbo.NameParser()功能似乎总是返回三行(forename,middle_name,eYSurame)。如果是这种情况,如果您在INSERT语句中使用这样的情况,您很可能会插入每个名称的每个名称。

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

我建议您仅运行上述查询的SELECT部分,而无需INSERT,以查看几个随机条目中返回的内容。我希望您会看到我在说什么。

您的语法错误附近:

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);< - 此Semicolon

最新更新