Tsql 如何使用insert使用用户定义的函数cross apply更新另一个表中的列
更新似乎正在运行,但我还需要使用parse names函数插入 --似乎正在运行的更新功能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
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
;但是您的duplicateWHERE
子句中的连接条件似乎是原始更新查询中表的简单复制和粘贴,该查询是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