如果您使用的是SQL Server 2008或更高版本,你可以使用MERGE
聲明,就像這樣:
/*
CREATE TABLE Proj1 (
ID INT PRIMARY KEY,
Text VARCHAR(100) NOT NULL,
reqId INT NOT NULL
)
INSERT INTO Proj1 VALUES (1,'R1|R2',12)
INSERT INTO Proj1 VALUES (2,'R2|R3',12)
INSERT INTO Proj1 VALUES (3,'R3|R5|R2',12)
CREATE TABLE Proj2 (
ID INT IDENTITY PRIMARY KEY,
Text VARCHAR(100) NOT NULL,
Active BIT NOT NULL,
reqId INT NOT NULL
)
SET IDENTITY_INSERT Proj2 ON
INSERT INTO Proj2 (ID, Text, Active, reqId) VALUES (3,'R1',1,12)
INSERT INTO Proj2 (ID, Text, Active, reqId) VALUES (4,'R3',1,12)
INSERT INTO Proj2 (ID, Text, Active, reqId) VALUES (5,'R4',1,12)
SET IDENTITY_INSERT Proj2 OFF
*/
GO
CREATE FUNCTION dbo.Split(@String VARCHAR(1000),@Separator CHAR(1))
RETURNS @Result TABLE (
Position INT IDENTITY PRIMARY KEY,
Value VARCHAR(1000)
) AS
BEGIN
DECLARE @Pos INT, @Prev INT
SET @Prev=0
WHILE 1=1 BEGIN
SET @Pos=CHARINDEX(@Separator,@String,@Prev+1)
IF @Pos=0 BREAK
INSERT INTO @Result (Value) VALUES (SUBSTRING(@String,@Prev+1,@[email protected]))
SET @[email protected]
END
INSERT INTO @Result (Value) VALUES (SUBSTRING(@String,@Prev+1,LEN(@String)))
RETURN
END
GO
MERGE INTO dbo.Proj2 p2
USING (
SELECT DISTINCT reqId, Value FROM dbo.Proj1 p1
CROSS APPLY dbo.Split(Text,'|') s
) x
ON p2.Text=x.Value AND p2.reqId=x.reqId
WHEN NOT MATCHED THEN INSERT VALUES (Value,1,reqid)
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET Active=0
WHEN MATCHED AND Active=0 THEN UPDATE SET Active=1;
SELECT * FROM dbo.Proj2
後來編輯:我增加了三分之一,這時候在MERGE語句條款,來處理行已經存在但沒有激活標誌的情況(儘管這種情況不會出現在樣本數據中)。
感謝您的回覆,我們可以做到這一點沒有合併。我需要得到一些使用文本值的ID查找合併可能不適合我的需要。 – user3038399