0

这是我的主表:

select Name, Age, Race, from Person

我根据我的 XML 文件中可用的内容创建了一个临时表,因此临时表可能包含我的Person表中的所有字段,或者只有 1 个或 2 个混合顺序。

Select * from #MyTempTable = Mike, 44

或者它可以是

Select * from #MyTempTable = Race, Mike

Person是否可以用我的临时表中的值填充我的表?

因此,如果#MyTempTable有一个列,则将表中的值Age填充到Person表中的列中AgeAgePerson

4

2 回答 2

0

SQL Server 解决方案:

您可以尝试以下解决方案之一:

IF EXISTS(SELECT * FROM tempdb.sys.columns c 
    WHERE c.object_id=OBJECT_ID(N'tempdb..#MyTempTable' AND c.name='Age')
BEGIN
    INSERT INTO #MyTempTable(Name,Age)
    SELECT ... FROM ... CROSS APPLY XmlCol.nodes('/...') a(b)
END
ELSE IF EXISTS(SELECT * FROM tempdb.sys.columns c 
    WHERE c.object_id=OBJECT_ID(N'tempdb..#MyTempTable' AND c.name='Race')
BEGIN
    INSERT INTO #MyTempTable(Name,Race)
    SELECT ... FROM ... CROSS APPLY XmlCol.nodes('/...') a(b)   
END

或者

INSERT INTO #MyTempTable(Name,Age,Race)
SELECT ... AS Name, 
    a.b.value('(@Age)[1]','TINYINT') AS Age
    a.b.value('(@Race)[1]','NVARCHAR(50)') AS Race, ...
    CASE WHEN <condition for Race column> THEN value ELSE NULL AS Race   
FROM ... CROSS APPLY XmlCol.nodes('/...') a(b)

注1:因为从系统视图读取数据sys.columns需要特殊权限(见链接)最简单的解决方案是第二种解决方案。

注意 2:从 SQL Server 2008 开始,您可以使用SPARSE 列来减少那些具有许多 NULL 列的列的存储大小。

于 2013-07-31T14:31:47.217 回答
0

我建议将 XML 转换为查询以创建临时表(SQL Server 将 XML 分解为临时表)。然后,您可以对 Age 和 Race 有单独的更新语句,例如:

UPDATE Person
SET Age = Imported.Age
FROM Person
   INNER JOIN Imported ON Imported.Name = Person.Name
WHERE Imported.Age IS NOT NULL

等等。

于 2013-07-31T16:52:29.887 回答