动态数据映射的存储过程
Stored Procedure for dynamic data mapping
我知道这一定已经解决了,但我很难找到解决方案。我尝试搜索:存储过程动态数据映射插入映射 table 在 Google 和此处。
我有一个数据映射 table 说
"OriginalColumn","OriginalTable","NewColumn","NewTable"
正如列名所示,此 table 将包含有关如何将一个 table 中的数据加载到另一个现有 table 中的元数据。
我想编写一个存储过程来发出一个
select *
from DataMapping
where OriginalTable = XXXX
然后使用返回的信息根据 OriginalColumn
到 NewColumn
的映射动态创建和执行 Insert into NewTable
。
下面是生成示例问题的代码:
/****** Object: Table [dbo].[DataMapping] Script Date: 7/23/2018 11:34:11 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DataMapping](
[OriginalColumn] [sysname] NOT NULL,
[OriginalTable] [sysname] NOT NULL,
[NewColumn] [sysname] NOT NULL,
[NewTable] [sysname] NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[destinationTable] Script Date: 7/23/2018 11:34:12 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[destinationTable](
[id] [int] NULL,
[field1] [nvarchar](50) NULL,
[field2] [nvarchar](50) NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[TableA] Script Date: 7/23/2018 11:34:12 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableA](
[sourceID] [int] NULL,
[sourceField1] [nchar](10) NULL,
[sourceField2] [nvarchar](50) NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[TableB] Script Date: 7/23/2018 11:34:12 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableB](
[sourceID] [int] NULL,
[sourceField1] [nchar](10) NULL,
[sourceField2] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField1', N'TableA', N'field1', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField2', N'TableA', N'field2', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceID', N'TableA', N'id', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField1', N'TableB', N'field1', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField2', N'TableB', N'field2', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceID', N'TableB', N'id', N'DestinationTable')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col1 ', NULL)
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col2 ', NULL)
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col1 ', N'12345ABC')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col2 ', N'24681DEF')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (1, N'col1 ', N'12345ABC')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (2, N'col2 ', N'24681DEF')
GO
INSERT [dbo].[TableA] ([sourceID], [sourceField1], [sourceField2]) VALUES (1, N'col1 ', N'12345ABC')
GO
INSERT [dbo].[TableA] ([sourceID], [sourceField1], [sourceField2]) VALUES (2, N'col2 ', N'24681DEF')
GO
INSERT [dbo].[TableB] ([sourceID], [sourceField1], [sourceField2]) VALUES (2, N'B1234 ', N'9999')
GO
INSERT [dbo].[TableB] ([sourceID], [sourceField1], [sourceField2]) VALUES (2, N'B5678 ', N'9999')
GO
最终解决方案
这是最终的解决方案,我采用了下面的最佳答案并将其转换为一个存储过程,允许我们选择我填充的目标 table,以防您不希望重新运行整个导入过程。
CREATE PROCEDURE [dbo].[DataMappingProc2]
(
@DestinationTable as VARCHAR(40)
)
AS
BEGIN
DECLARE @Sql nvarchar(max) = ''
SELECT @Sql += 'INSERT INTO '+ NewTable +'(' +
STUFF((SELECT ', ' + NewColumn
FROM dbo.DataMapping t1
WHERE t1.NewTable = t0.NewTable
AND t1.OriginalTable = t0.OriginalTable
And t1.NewTable = @DestinationTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +') ' +
'SELECT '+
STUFF((SELECT ', ' + OriginalColumn
FROM dbo.DataMapping t2
WHERE t2.NewTable = t0.NewTable
AND t2.OriginalTable = t0.OriginalTable
And t2.NewTable = @DestinationTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +' FROM '+ OriginalTable +'; '
FROM dbo.DataMapping t0
WHERE t0.NewTable = @DestinationTable
GROUP BY NewTable, OriginalTable
EXEC (@Sql)
Return 0
END
GO
运行 存储过程
DECLARE @return_value int
EXEC @return_value = [dbo].[DataMappingProc2]
@DestinationTable = N'DestinationTable'
SELECT 'Return Value' = @return_value
GO
示例数据
CREATE TABLE dbo.DataMapping ( OriginalColumn SYSNAME
,OriginalTable SYSNAME
,NewColumn SYSNAME
,NewTable SYSNAME)
INSERT INTO dbo.DataMapping
( OriginalColumn
, OriginalTable
, NewColumn
, NewTable)
VALUES
( 'Col1' , 'TableA' , 'Col_1' , 'TableAN') , ( 'Col2' , 'TableA' , 'Col_2' , 'TableAN')
, ( 'Col3' , 'TableA' , 'Col_3' , 'TableAN') , ( 'Col1' , 'TableB' , 'Col_1' , 'TableBN')
, ( 'Col2' , 'TableB' , 'Col_2' , 'TableBN') , ( 'Col3' , 'TableB' , 'Col_3' , 'TableBN');
查询
Declare @O_Cols sysname
, @N_Cols sysname
, @O_Tabl sysname
, @N_Tabl sysname
, @InsertColsList NVARCHAR(MAX) =''
, @SelectColsLIst NVARCHAR(MAX) =''
, @Sql NVARCHAR(MAX);
DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT OriginalColumn , NewColumn
FROM dbo.DataMapping
WHERE OriginalTable = 'TableA'
OPEN Cur
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SelectColsLIst += ISNULL(',' + QUOTENAME(@O_Cols), '');
SET @InsertColsList += ISNULL(',' + QUOTENAME(@N_Cols), '');
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
END
CLOSE Cur
DEALLOCATE Cur;
SET @SelectColsLIst = STUFF(@SelectColsLIst, 1 ,1,'');
SET @InsertColsList = STUFF(@InsertColsList, 1 ,1,'');
SELECT TOP 1 @O_Tabl = OriginalTable , @N_Tabl = NewTable
FROM dbo.DataMapping
WHERE OriginalTable = 'TableA'
SET @Sql = N' INSERT INTO ' + @N_Tabl + N'( ' + @InsertColsList + N' )'
+ N' SELECT ' + @SelectColsLIst
+ N' FROM ' + @O_Tabl;
PRINT @Sql
--EXEC sp_executesql @Sql;
备注
我假设数据仅来自一个 table 并且仅流向一个 table,列名在源和目标 table 中可以不同并且table 名称可以不同,但始终是一对一的映射。
更新: 在写我原来的答案时,我错误地认为每对表和列之间会有一个唯一的映射(如果原来的问题包括它现在包含的示例数据该假设将被避免)-因此我的回答是错误的。
现在问题已更新为包含适当的示例数据,我可以更新我的答案 - 通过向子查询添加另一个条件并向原始查询添加分组依据,我已经设法获得了一个可行的解决方案:
DECLARE @Sql nvarchar(max) = ''
SELECT @Sql += 'INSERT INTO '+ NewTable +'(' +
STUFF((SELECT ', ' + NewColumn
FROM dbo.DataMapping t1
WHERE t1.NewTable = t0.NewTable
AND t1.OriginalTable = t0.OriginalTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +') ' +
'SELECT '+
STUFF((SELECT ', ' + OriginalColumn
FROM dbo.DataMapping t2
WHERE t2.NewTable = t0.NewTable
AND t2.OriginalTable = t0.OriginalTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +' FROM '+ OriginalTable +'; '
FROM dbo.DataMapping t0
GROUP BY NewTable, OriginalTable
第一个版本
这是一种不需要使用游标的解决方案:
DECLARE @Sql nvarchar(max) = ''
SELECT @Sql += 'INSERT INTO '+ NewTable +'(' +
STUFF((SELECT ', ' + NewColumn
FROM dbo.DataMapping t1
WHERE t1.NewTable = t0.NewTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +') ' +
'SELECT '+
STUFF((SELECT ', ' + OriginalColumn
FROM dbo.DataMapping t2
WHERE t2.NewTable = t0.NewTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +' FROM '+ OriginalTable +'; '
FROM dbo.DataMapping t0
EXEC (@Sql)
感谢 M.Ali 的示例数据,您可以看到 live demo on rextester。
最后我选择了Zohar的方案;但是我确实很喜欢 M Ali 的解决方案。下面是我如何将 M Ali 的解决方案修改为存储过程,以便我可以针对不同的源表多次调用它。
Zohar 的解决方案也可以调整为仅处理特定的表,但就目前而言,它很好。
CREATE PROCEDURE [dbo].[DataMappingProc]
(
@Tblname as VARCHAR(10)
)
AS
BEGIN
Declare @O_Cols sysname
, @N_Cols sysname
, @O_Tabl sysname
, @N_Tabl sysname
, @InsertColsList NVARCHAR(MAX) =''
, @SelectColsLIst NVARCHAR(MAX) =''
, @Sql NVARCHAR(MAX);
DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT OriginalColumn , NewColumn
FROM dbo.DataMapping
WHERE OriginalTable = @Tblname
OPEN Cur
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SelectColsLIst += ISNULL(',' + QUOTENAME(@O_Cols), '');
SET @InsertColsList += ISNULL(',' + QUOTENAME(@N_Cols), '');
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
END
CLOSE Cur
DEALLOCATE Cur;
SET @SelectColsLIst = STUFF(@SelectColsLIst, 1 ,1,'');
SET @InsertColsList = STUFF(@InsertColsList, 1 ,1,'');
SELECT TOP 1 @O_Tabl = OriginalTable , @N_Tabl = NewTable
FROM dbo.DataMapping
WHERE OriginalTable = 'TableA'
SET @Sql = N' INSERT INTO ' + @N_Tabl + N'( ' + @InsertColsList + N' )'
+ N' SELECT ' + @SelectColsLIst
+ N' FROM ' + @O_Tabl;
EXEC sp_executesql @Sql;
RETURN 0
END;
GO
我知道这一定已经解决了,但我很难找到解决方案。我尝试搜索:存储过程动态数据映射插入映射 table 在 Google 和此处。
我有一个数据映射 table 说
"OriginalColumn","OriginalTable","NewColumn","NewTable"
正如列名所示,此 table 将包含有关如何将一个 table 中的数据加载到另一个现有 table 中的元数据。
我想编写一个存储过程来发出一个
select *
from DataMapping
where OriginalTable = XXXX
然后使用返回的信息根据 OriginalColumn
到 NewColumn
的映射动态创建和执行 Insert into NewTable
。
下面是生成示例问题的代码:
/****** Object: Table [dbo].[DataMapping] Script Date: 7/23/2018 11:34:11 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DataMapping](
[OriginalColumn] [sysname] NOT NULL,
[OriginalTable] [sysname] NOT NULL,
[NewColumn] [sysname] NOT NULL,
[NewTable] [sysname] NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[destinationTable] Script Date: 7/23/2018 11:34:12 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[destinationTable](
[id] [int] NULL,
[field1] [nvarchar](50) NULL,
[field2] [nvarchar](50) NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[TableA] Script Date: 7/23/2018 11:34:12 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableA](
[sourceID] [int] NULL,
[sourceField1] [nchar](10) NULL,
[sourceField2] [nvarchar](50) NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[TableB] Script Date: 7/23/2018 11:34:12 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableB](
[sourceID] [int] NULL,
[sourceField1] [nchar](10) NULL,
[sourceField2] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField1', N'TableA', N'field1', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField2', N'TableA', N'field2', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceID', N'TableA', N'id', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField1', N'TableB', N'field1', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceField2', N'TableB', N'field2', N'DestinationTable')
GO
INSERT [dbo].[DataMapping] ([OriginalColumn], [OriginalTable], [NewColumn], [NewTable]) VALUES (N'sourceID', N'TableB', N'id', N'DestinationTable')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col1 ', NULL)
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col2 ', NULL)
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col1 ', N'12345ABC')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (NULL, N'col2 ', N'24681DEF')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (1, N'col1 ', N'12345ABC')
GO
INSERT [dbo].[destinationTable] ([id], [field1], [field2]) VALUES (2, N'col2 ', N'24681DEF')
GO
INSERT [dbo].[TableA] ([sourceID], [sourceField1], [sourceField2]) VALUES (1, N'col1 ', N'12345ABC')
GO
INSERT [dbo].[TableA] ([sourceID], [sourceField1], [sourceField2]) VALUES (2, N'col2 ', N'24681DEF')
GO
INSERT [dbo].[TableB] ([sourceID], [sourceField1], [sourceField2]) VALUES (2, N'B1234 ', N'9999')
GO
INSERT [dbo].[TableB] ([sourceID], [sourceField1], [sourceField2]) VALUES (2, N'B5678 ', N'9999')
GO
最终解决方案
这是最终的解决方案,我采用了下面的最佳答案并将其转换为一个存储过程,允许我们选择我填充的目标 table,以防您不希望重新运行整个导入过程。
CREATE PROCEDURE [dbo].[DataMappingProc2]
(
@DestinationTable as VARCHAR(40)
)
AS
BEGIN
DECLARE @Sql nvarchar(max) = ''
SELECT @Sql += 'INSERT INTO '+ NewTable +'(' +
STUFF((SELECT ', ' + NewColumn
FROM dbo.DataMapping t1
WHERE t1.NewTable = t0.NewTable
AND t1.OriginalTable = t0.OriginalTable
And t1.NewTable = @DestinationTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +') ' +
'SELECT '+
STUFF((SELECT ', ' + OriginalColumn
FROM dbo.DataMapping t2
WHERE t2.NewTable = t0.NewTable
AND t2.OriginalTable = t0.OriginalTable
And t2.NewTable = @DestinationTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +' FROM '+ OriginalTable +'; '
FROM dbo.DataMapping t0
WHERE t0.NewTable = @DestinationTable
GROUP BY NewTable, OriginalTable
EXEC (@Sql)
Return 0
END
GO
运行 存储过程
DECLARE @return_value int
EXEC @return_value = [dbo].[DataMappingProc2]
@DestinationTable = N'DestinationTable'
SELECT 'Return Value' = @return_value
GO
示例数据
CREATE TABLE dbo.DataMapping ( OriginalColumn SYSNAME
,OriginalTable SYSNAME
,NewColumn SYSNAME
,NewTable SYSNAME)
INSERT INTO dbo.DataMapping
( OriginalColumn
, OriginalTable
, NewColumn
, NewTable)
VALUES
( 'Col1' , 'TableA' , 'Col_1' , 'TableAN') , ( 'Col2' , 'TableA' , 'Col_2' , 'TableAN')
, ( 'Col3' , 'TableA' , 'Col_3' , 'TableAN') , ( 'Col1' , 'TableB' , 'Col_1' , 'TableBN')
, ( 'Col2' , 'TableB' , 'Col_2' , 'TableBN') , ( 'Col3' , 'TableB' , 'Col_3' , 'TableBN');
查询
Declare @O_Cols sysname
, @N_Cols sysname
, @O_Tabl sysname
, @N_Tabl sysname
, @InsertColsList NVARCHAR(MAX) =''
, @SelectColsLIst NVARCHAR(MAX) =''
, @Sql NVARCHAR(MAX);
DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT OriginalColumn , NewColumn
FROM dbo.DataMapping
WHERE OriginalTable = 'TableA'
OPEN Cur
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SelectColsLIst += ISNULL(',' + QUOTENAME(@O_Cols), '');
SET @InsertColsList += ISNULL(',' + QUOTENAME(@N_Cols), '');
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
END
CLOSE Cur
DEALLOCATE Cur;
SET @SelectColsLIst = STUFF(@SelectColsLIst, 1 ,1,'');
SET @InsertColsList = STUFF(@InsertColsList, 1 ,1,'');
SELECT TOP 1 @O_Tabl = OriginalTable , @N_Tabl = NewTable
FROM dbo.DataMapping
WHERE OriginalTable = 'TableA'
SET @Sql = N' INSERT INTO ' + @N_Tabl + N'( ' + @InsertColsList + N' )'
+ N' SELECT ' + @SelectColsLIst
+ N' FROM ' + @O_Tabl;
PRINT @Sql
--EXEC sp_executesql @Sql;
备注
我假设数据仅来自一个 table 并且仅流向一个 table,列名在源和目标 table 中可以不同并且table 名称可以不同,但始终是一对一的映射。
更新: 在写我原来的答案时,我错误地认为每对表和列之间会有一个唯一的映射(如果原来的问题包括它现在包含的示例数据该假设将被避免)-因此我的回答是错误的。
现在问题已更新为包含适当的示例数据,我可以更新我的答案 - 通过向子查询添加另一个条件并向原始查询添加分组依据,我已经设法获得了一个可行的解决方案:
DECLARE @Sql nvarchar(max) = ''
SELECT @Sql += 'INSERT INTO '+ NewTable +'(' +
STUFF((SELECT ', ' + NewColumn
FROM dbo.DataMapping t1
WHERE t1.NewTable = t0.NewTable
AND t1.OriginalTable = t0.OriginalTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +') ' +
'SELECT '+
STUFF((SELECT ', ' + OriginalColumn
FROM dbo.DataMapping t2
WHERE t2.NewTable = t0.NewTable
AND t2.OriginalTable = t0.OriginalTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +' FROM '+ OriginalTable +'; '
FROM dbo.DataMapping t0
GROUP BY NewTable, OriginalTable
第一个版本
这是一种不需要使用游标的解决方案:
DECLARE @Sql nvarchar(max) = ''
SELECT @Sql += 'INSERT INTO '+ NewTable +'(' +
STUFF((SELECT ', ' + NewColumn
FROM dbo.DataMapping t1
WHERE t1.NewTable = t0.NewTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +') ' +
'SELECT '+
STUFF((SELECT ', ' + OriginalColumn
FROM dbo.DataMapping t2
WHERE t2.NewTable = t0.NewTable
ORDER BY NewColumn
FOR XML PATH('')), 1, 2, '') +' FROM '+ OriginalTable +'; '
FROM dbo.DataMapping t0
EXEC (@Sql)
感谢 M.Ali 的示例数据,您可以看到 live demo on rextester。
最后我选择了Zohar的方案;但是我确实很喜欢 M Ali 的解决方案。下面是我如何将 M Ali 的解决方案修改为存储过程,以便我可以针对不同的源表多次调用它。
Zohar 的解决方案也可以调整为仅处理特定的表,但就目前而言,它很好。
CREATE PROCEDURE [dbo].[DataMappingProc]
(
@Tblname as VARCHAR(10)
)
AS
BEGIN
Declare @O_Cols sysname
, @N_Cols sysname
, @O_Tabl sysname
, @N_Tabl sysname
, @InsertColsList NVARCHAR(MAX) =''
, @SelectColsLIst NVARCHAR(MAX) =''
, @Sql NVARCHAR(MAX);
DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT OriginalColumn , NewColumn
FROM dbo.DataMapping
WHERE OriginalTable = @Tblname
OPEN Cur
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SelectColsLIst += ISNULL(',' + QUOTENAME(@O_Cols), '');
SET @InsertColsList += ISNULL(',' + QUOTENAME(@N_Cols), '');
FETCH NEXT FROM Cur INTO @O_Cols , @N_Cols
END
CLOSE Cur
DEALLOCATE Cur;
SET @SelectColsLIst = STUFF(@SelectColsLIst, 1 ,1,'');
SET @InsertColsList = STUFF(@InsertColsList, 1 ,1,'');
SELECT TOP 1 @O_Tabl = OriginalTable , @N_Tabl = NewTable
FROM dbo.DataMapping
WHERE OriginalTable = 'TableA'
SET @Sql = N' INSERT INTO ' + @N_Tabl + N'( ' + @InsertColsList + N' )'
+ N' SELECT ' + @SelectColsLIst
+ N' FROM ' + @O_Tabl;
EXEC sp_executesql @Sql;
RETURN 0
END;
GO