我的表格定义如下:
UserData (ColA, ColB, ColC)
- 此表由.CSV文件填充。
这些列名称不固定,表格列数在不同的.CSV文件中有所不同,具体取决于提供.CSV文件的客户。
UserDataDSU (ColD, ColE, ColF, ColG, ColH, ColI, ColJ)
现在,我必须用UserDataDSU
表格填写UserData
表,如下所示。
如果UserData(ColC)
存在并且有数据,请填写UserDataDSU(ColD)
,然后将ColD
设为NULL
如果UserData(ColA)
存在并且有数据,请填写UserDataDSU(ColE)
,然后将ColE
设为NULL
如果UserData(ColB)
存在并且有数据,请填写UserDataDSU(ColF)
,然后将ColF
设为NULL
当然,对于UserDataDSU
中的所有剩余列(例如ColG
,ColH
,ColI
,ColJ
在其couter表中没有数据 - UserData
,所有这些都应由NULLs
填写。
请记住,对于其他客户提供的其他.CSV文件数据可能存在于这些列中的某些或所有列
任何人都可以建议如何在存储过程中执行此操作。
答案 0 :(得分:0)
TLDR
您可以使用sys.objects
根据业务逻辑生成表之间的列,然后使用此映射创建动态INSERT
sql脚本。
以下是所有这些
的SQL脚本DECLARE @sql varchar(max) -- will be used for holding dynamic SQL script
-- this temp table will hold the mapping
CREATE TABLE #temp (DColName varchar(100), SColName varchar(100), OrderCol int)
--inserting mapping into temp table based on business logic
INSERT INTO #temp
SELECT
Dest.name,
Source.name,
Dest.object_id -- ordering criteria to generate accurate mapping in script
FROM
sys.columns Dest LEFT JOIN
(
SELECT
name,
CASE
WHEN name='ColC' THEN 'ColD'
WHEN name='ColA' THEN 'ColE'
WHEN name='ColB' THEN 'ColF'
ELSE name
END as Newname -- business logic for matching
FROM
sys.columns
WHERE
object_id IN (
SELECT object_id FROM sys.tables WHERE name ='UserData'
)
)source
ON Dest.Name=Source.NewName
WHERE
Dest.object_id IN (
SELECT object_id
FROM sys.tables
WHERE name ='UserDataDSU'
)
--create the dynamic SQL
SELECT @sql =
'INSERT INTO UserDataDSU ('+
--insert column list of destination table
STUFF((SELECT ','+ Dcolname FROM #temp WHERE Scolname IS NOT NULL ORDER BY OrderCol ASC FOR XML PATH('')),1,1,'') +
') SELECT '+
--insert column list of source table
STUFF((SELECT ','+ Scolname FROM #temp ORDER BY OrderCol ASC FOR XML PATH('')),1,1,'') +
' FROM UserData'
-- execute the dynamic SQL
EXEC(@sql)
-- now drop the temp table
DROP TABLE #temp
请注意我测试了这个,这对我有用。
使用的CREATE INSERT
表脚本位于
create table UserData (ColA varchar(100), ColB varchar(100), ColC varchar(100));
insert into UserData values ('A1','B1','C1'),('A2','B2','C2');
create table UserDataDSU (ColD varchar(100), ColE varchar(100), ColF varchar(100), ColG varchar(100), ColH varchar(100), ColI varchar(100), ColJ varchar(100));