填充列匹配的表TSQL

时间:2013-07-31 13:56:26

标签: sql-server tsql temp

这是我的主要表格:

select Name, Age, Race, from Person

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

Select * from #MyTempTable = Mike, 44

或者可以是

Select * from #MyTempTable = Race, Mike

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

因此,如果#MyTempTable有一个列Age,那么只需将Person值填入表Age中的AgePerson表}

2 个答案:

答案 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

等等。