这里是我的解决方案:
CREATE TRIGGER UniqueStockMarketInserts ON [dbo].[StockMarket]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @StockId int
SELECT @StockId = S.ID
FROM [StockMarket] S INNER JOIN [INSERTED] I
ON
S.YahooSymbol = I.YahooSymbol OR
S.ReutersRIC = I.ReutersRIC OR
S.BloombergTicker = I.BloombergTicker OR
S.ISIN = I.ISIN
IF @StockId IS NULL
BEGIN
INSERT INTO [StockMarket] (YahooSymbol,ReutersRIC,BloombergTicker,ISIN)
SELECT I.YahooSymbol, I.ReutersRIC, I.BloombergTicker, I.ISIN
FROM [INSERTED] I
END
ELSE
BEGIN
UPDATE S SET
S.ISIN = ISNULL(S.ISIN,I.ISIN),
S.YahooSymbol = ISNULL(S.YahooSymbol,I.YahooSymbol),
S.ReutersRIC = ISNULL(S.ReutersRIC,I.ReutersRIC),
S.BloombergTicker = ISNULL(S.BloombergTicker,I.BloombergTicker)
FROM INSERTED I, StockMarket S
WHERE S.ID = @StockId
END
END
GO
下面是我在上面跑了现实生活中的例子测试(除了ISIN我做了):
/*-----------TESTING THE TRIGGER--------*/
INSERT INTO StockMarket (ReutersRIC, BloombergTicker) VALUES ('G.TO', 'GG US Equity');
INSERT INTO StockMarket (YahooSymbol, BloombergTicker, ISIN) VALUES ('GOOG', 'GOOG US Equity','US123454321');
INSERT INTO StockMarket (YahooSymbol, ISIN) VALUES ('RDSA','NL111112222')
INSERT INTO StockMarket (YahooSymbol, ReutersRIC) VALUES ('GG', 'G.TO'); /*this should update as per trigger*/
INSERT INTO StockMarket (ReutersRIC, ISIN) Values ('GOOG.OQ','US123454321'); /*this should update as per trigger*/
INSERT INTO StockMarket (YahooSymbol, ReutersRIC) Values ('RDSA', 'RDSa.L'); /*this should update as per trigger*/
而且结果:
希望这可以帮助别人的未来。快乐编码