Tsql 如何使用insert使用用户定义的函数cross apply更新另一个表中的列

Tsql 如何使用insert使用用户定义的函数cross apply更新另一个表中的列,tsql,Tsql,更新似乎正在运行,但我还需要使用parse names函数插入 --似乎正在运行的更新功能 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 CR

更新似乎正在运行,但我还需要使用parse names函数插入

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

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); //right here
CROSS APPLY dbo.NameParser(c.Contact) T
WHERE p.PEOPLE_ID = c.KEY4
从这里删除分号:
(c.KEY1=p.PEOPLE\u ID)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团队关于分号给你带来麻烦的说法也是正确的;这是您最初的错误消息

除此之外,您正在执行一个
插入
SISUnitTest.dbo.People
,您试图将其别名为
p
;但是您的duplicate
WHERE
子句中的连接条件似乎是原始更新查询中表的简单复制和粘贴,该查询是
PCUnitTest.dbo.People AS P
,因此我想知道这些条件是否不再合适。
SISUnitTest.dbo.People
是否与
PCUnitTest.dbo.People
具有相同的字段

如果您想将
PCUnitTest.dbo.People
GMUnitTest.dbo.Contact1
插入
SISUnitTest.dbo.People
,那么这是可能的,但您必须将查询重新构造为类似这样的内容(您的一些原始行已被注释掉,因为它们似乎有错误):

值得注意的是,在这种格式中,
内部连接几乎是无用的,除非您使用它来检查
PCUnitTest.dbo.People
以及
GMUnitTest.dbo.Contact1
中是否存在相同的列表。如果这不重要,那么您可以简单地从此查询中删除
内部连接

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

正如我前面的答案所建议的,您可能需要考虑添加第二个参数到dBo。NameParser < /C> >,以便您可以请求名称的特定部分。这将允许您插入单个行。


我建议您只运行上面查询的
SELECT
部分,而不运行
INSERT
来查看在一些随机条目上返回的内容。我希望您会看到我所说的内容。

谢谢,它仍然在交叉应用附近显示错误语法错误,我在粘贴箱上有测试表和数据。谢谢,是的我第一次使用t-sql是在90年代,所以现在交叉应用是在2005年添加的。我想它会返回三行,因为字符串“76-ENR”有三个数学,我会添加键,看看它是否仍然返回3行。此外,这是一些代码,将用于插入和更新触发器。因此,我还没有找到在sc中测试代码的方法cript.我一直在编写一些测试代码,然后将其更改为inserted。其中C.Key1='76-ENR'和P.PEOPLE_ID=C.KEY4当我运行引用插入表的脚本时,消息显示“Invalid object name”inserted。是否有方法测试在测试脚本中使用插入表的代码,或者是在进程中运行它的唯一方法?INSERT在SISUnitTest.dbo.People(名字、中间名、姓氏)中,从插入的i内部连接PCUnitTest.dbo.People P ON P.People\u ID=i.Key4交叉应用dbo.NameParser(i.Contact)T其中i.Key1='76-ENR'和P.PEOPLE\u ID=i。KEY4@ERPise我没有在我的查询中使用插入的
表,因为您不是在谈论
触发器
。如果这是针对
触发器
,那么查询就不同了。您在注释中发布的关于
触发器
的查询没有问题,但相同查询不能以独立方式运行,因为如果只是作为常规查询运行,
插入的
表将不可供参考。所以这是一个
触发器
,还是一个常规查询?谢谢,我正在测试此查询中的逻辑,因为我不知道如何在触发器中测试它,当我在tri中运行脚本时gger消息显示“插入的对象名称无效”。“这将用于触发器,因此应该只有一条记录被更新,因此现在它正在更新三条记录,因为源表中有多条记录,但当它在进程中运行时,将只有一条记录被更新,所以现在我只是测试日志ic正确,然后将源表更改为插入
FROM             CONTACT1 c
WHERE        (c.KEY1 = p.PEOPLE_ID); --1
CROSS APPLY dbo.NameParser(c.Contact) T
WHERE p.PEOPLE_ID = c.KEY4 --2
--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