我正在尝试在SQL Server 2008中做一些不同的 SELECT 。我需要将 XML 文件导入到表中,但首先我必须进行一些检查。
当我SELECT
在 XML 上执行时,我需要检查 XML 行是否已存在于表中,使用列ViagemID
和Data
表中的列作为 PK。如果存在,我需要使用从 XML 读取的信息更新该行,如果不存在,我只需要在表中插入。
XML 行示例:
<viagem id="0000EPN" date="2013-01-01T00:00:00" type="EXTRA"
status="NORMAL" modalid="IPANEM" fleetid="B200"
departuretime="2013-04-01T00:00:00" arrivaltime="2013-01-01T00:20:00"
maxpasg="2000" locationid="XX" codredlinha="0007" />
代码:
SELECT @ViagemID = r.value('(@id)[1]', 'VARCHAR(30)'), @Data = CAST(CONVERT(datetime,r.value('(@date)[1]', 'datetime')) as float),
@Extra = CASE (r.value('(@type)[1]', 'VARCHAR(15)')) WHEN 'EXTRA' THEN 1 ELSE 0 END, @FleetID = r.value('(@fleetid)[1]', 'VARCHAR(15)'),
@Partida = r.value('(@departuretime)[1]', 'datetime'), @Chegada = r.value('(@arrivaltime)[1]', 'datetime'), @Capacidade = r.value('(@maxpasg)[1]', 'int'),
@LocationID = r.value('(@locationid)[1]', 'VARCHAR(10)'), @CodLinha = r.value('(@codredlinha)[1]', 'int')
IF EXISTS (SELECT * FROM dbo.ImportacaoXML WHERE ViagemID = @ViagemID AND Data = @Data)
BEGIN
UPDATE dbo.ImportacaoXML SET ViagemID = @ViagemID, Data = @Data, Extra = @Extra, FleetID = @FleetID, Partida = @Partida,
Chegada = @Chegada, Capacidade = @Capacidade, LocationID = @LocationID, CodLinha = @CodLinha
WHERE ViagemID = @ViagemID AND Data = @Data
END
ELSE
BEGIN
INSERT INTO dbo.ImportacaoXML VALUES(@ViagemID, @Data, @Extra, @FleetID, @Partida, @Chegada, @Capacidade, @LocationID, @CodLinha)
END
FROM (SELECT CAST(x AS XML) FROM OPENROWSET (BULK '\\10.16.68.253\XXXXx\Xxxx.xml', SINGLE_BLOB) AS T(x)) AS T(x)
CROSS APPLY x.nodes('/root/viagem') AS X(r);
但是我在最后一行中不断出现错误FROM
(AS 附近的语法不正确)。
我可以SELECT
在 if 语句中使用 a,但我需要读取所有 XML,这将停止执行。之后,我需要添加更多的 IF 语句。
注 1:我是 SQL 新手,如果有任何废话,我很抱歉。
注2:我也很关心性能,因为我不确定这段代码是否是最佳程序实践,而且我的表会增长很多。