如何填充在SQL Server基于条件表数据
问题描述:
我的表的定义如下图所示:如何填充在SQL Server基于条件表数据
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)
else ColF
as NULL
当然,对于所有的re在UserDataDSU
(如ColG
,ColH
,ColI
,ColJ
,ColJ
的数据列中没有数据 - UserData
,所有这些都应该填写NULLs
。
请记住,对于一些其他的.CSV文件从其他客户的数据可能存在一些或所有这些柱
任何人都可以请建议如何做到这一点的存储过程里面了。
答
TLDR
您可以使用sys.objects
来生成匹配根据你的业务逻辑表之间的列,然后使用该映射来创建动态INSERT
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
请注意,我试用了这个工作对我的SQL脚本。 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));