MSSQL里面能做到根据一个A表的所有字段,然后去获取另外一个B表对应的这些字段,然后插入到A表中去吗?
MSSQL里面能做到根据一个A表的所有字段,然后去获取另外一个B表对应的这些字段,然后插入到A表中去吗?
B表的字段数量是大于并且包括了A表的所有字段的。
顺便问个问题Merge Into NAME
这个MERGE 后面的跟的:
When Matched Then Update SET
When Not Matched By Target Then Insert values
只是 匹配的什么 和不匹配的什么哦
[解决办法]
MSSQL2008R2新功能:MERGE INTO dbo.T1 AS A --目标表USING dbo.T1 AS B ON A.custid=B.custid --来源表,MERGE谓词WHEN MATCHED THEN --当一个来源行与一个目标行匹配UPDATE SET A.companyname=B.companyname, --根据来源行修改目标行 A.phone=B.phone, A.[address]=B.[address]WHEN NOT MATCHED THEN --当一个来源行找不到与之匹配的目标行INSERT ( --添加到目标表 custid, companyname, phone, [address], inactive )VALUES ( B.custid, B.companyname, B.phone, B.[address], 0 )WHEN NOT MATCHED BY SOURCE THEN --当一个目标行找不到与之匹配的来源行DELETE; --删除目标行
[解决办法]
USE tempdb; GO IF OBJECT_ID (N'Target', N'U') IS NOT NULL DROP TABLE dbo.Target; GO Create table Target(ID int ,Name nvarchar(10)) insert into Target values(1,'a'),(3,'b'), (5,'c'),(10,'d') GO IF OBJECT_ID (N'dbo.Source', N'U') IS NOT NULL DROP TABLE dbo.Source; GO Create table Source(ID int ,Name nvarchar(10)) insert into Source values(2,'E'),(4,'F'), (6,'H'),(10,'I') /*Target--源表 ID Name 1 a 3 b 5 c 10 d */ /*Source--目标表 ID Name 2 E 4 F 6 H 10 I */ go begin tran merge Target as T using Source as S on (T.ID=S.ID) when matched and T.Name<>S.Name --ID相同,Name不同时更新 then update set T.Name=S.Name when not matched then --这里可不用写by Target(not matched by Target )没有的ID,新增 insert (ID,Name)values(S.ID,S.Name) when not matched by source then --删除Target表在Source表没有的记录 delete OUTPUT $action, inserted.ID AS SourceID, inserted.Name AS SourceName, deleted.ID AS TargetID, deleted.Name AS TargetName; select * from Target select * from Source rollback tran /*$action $action SourceID SourceName TargetID TargetName INSERT 2 E NULL NULL INSERT 4 F NULL NULL INSERT 6 H NULL NULL DELETE NULL NULL 1 a DELETE NULL NULL 3 b DELETE NULL NULL 5 c UPDATE 10 I 10 d Target ID Name 10 I 2 E 4 F 6 H Source ID Name 2 E 4 F 6 H 10 I */ go