我有一个csv文件,我想在sql表中传输。但文件的格式是:
日期| id1 | id2
1/1 | 1.2 | 1.3
1/2 | 1.34 | 1.25
我希望将其存储在表格中的方式是:
1/1 | id1 | 1.2
1/1 | id2 | 1.3
1/2 | id1 | 1.34
1/2 | id2 | 1.25
有办法做到这一点吗?
答案 0 :(得分:0)
假设您已将CSV导入到具有与CSV相同格式的临时表中:
INSERT INTO new_table
SELECT date, 'id1' AS id_name, id1 AS id
FROM temp
UNION ALL
SELECT date, 'id2' AS id_name, id2 AS id
FROM temp
ORDER BY date, id_name
答案 1 :(得分:0)
如果对TVF开放,以下几乎会将任何表格,视图或查询转换为EAV结构。
注意我们不必定义任何字段。唯一的约定是FIRST列是实体
示例强>
-- Entire Table
Select *
From [dbo].[tvf-EAV]((Select * from YourTable for XML RAW) )
-- Or Row by Row via A CROSS APPLY
Select B.*
From YourTable A
Cross Apply [dbo].[tvf-EAV]((Select A.* for XML RAW) ) B
返回
Entity Attribute Value
1/1 id1 1.20
1/1 id2 1.30
1/2 id1 1.34
1/2 id2 1.25
感兴趣的UDF
CREATE FUNCTION [dbo].[tvf-EAV](@XML xml)
Returns Table
As
Return (
with cteKey(k) as (
Select Top 1 xA.value('local-name(.)','varchar(100)')
From @XML.nodes('/row') A(xR)
Cross Apply A.xR.nodes('./@*') B(xA)
)
Select Entity = xR.value('@*[1]' ,'varchar(100)')
,Attribute = xA.value('local-name(.)','varchar(100)')
,Value = xA.value('.' ,'varchar(max)')
From @XML.nodes('/row') A(xR)
Cross Apply A.xR.nodes('./@*') B(xA)
Where xA.value('local-name(.)','varchar(100)') Not In (Select k From cteKey)
)
-- Notes: First Field in Query will be the Entity
-- Select * From [dbo].[tvf-EAV]((Select MyEntity=GetUTCDate(),* From sys.dm_os_sys_info for XML RAW))