这是我的主要表格:
select Name, Age, Race, from Person
我根据XML文件中的可用内容创建临时表,因此临时表可能包含表格中的所有字段人员,或者只是混合顺序中的1或2。
Select * from #MyTempTable = Mike, 44
或者可以是
Select * from #MyTempTable = Race, Mike
是否可以使用我临时表中的值来填充Person
表格?
因此,如果#MyTempTable
有一个列Age
,那么只需将Person
值填入表Age
中的Age
列Person
表}
答案 0 :(得分: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
系统视图中读取数据需要特殊权限(参见link),最简单的解决方案是第二种解决方案。
注意2:从SQL Server 2008开始,您可以使用SPARSE columns来减少那些包含许多NULL列的列的存储大小。
答案 1 :(得分:0)
我建议将XML转换为查询以创建临时表(SQL Server shred XML to temp table)。然后,您可以为Age和Race提供单独的更新语句,例如:
UPDATE Person
SET Age = Imported.Age
FROM Person
INNER JOIN Imported ON Imported.Name = Person.Name
WHERE Imported.Age IS NOT NULL
等等。