我有一个使用动态查询实现SP的场景,由于性能因素,我需要删除此实现。这是一个导入功能,我们最初将我们的数据从excel插入到临时表中,然后我们验证我们的数据,将数据保存到另一个临时表中。然后,如果所有验证都通过,则将数据插入物理表。
登台表可以有四类数据(FParty,SParty,TParty,所有者),这些数据一次从excel传递到暂存。并且这些类别的物理表包含不同数量的列。因此,在运行时,我们只能知道数据的类别,然后我们必须相应地创建临时表以验证数据。
截至目前,我们正在使用动态查询在运行时根据类别创建临时表。程序如下:
CREATE procedure [dbo].[GetData_Into_Temptbl] (
,@CategoryType varchar(50) -- FParty, SParty, TParty, Owner)
BEGIN
declare Category cursor for
select Fields from dbo.StagingTable where CategoryName= @CategoryType
Open Category
Fetch Next from Category into @Field
while @@Fetch_status = 0
begin
set @FieldsToCreatetempTable = @ FieldsToCreatetempTable + ',' + @Field
Fetch Next from Category into @Field
end
close Category
deallocate Category
set @tblTemp = 'insert into #TempTableData ('+@FieldsToCreatetempTable+')'
Exec(@tblTemp)
END
上面的代码工作正常,但需要替换过程的动态性质。请提出任何概念。
答案 0 :(得分:0)
用于构建以逗号分隔的列列表的表/游标是过度的,就像主要的过度杀伤一样。
您可以考虑将逻辑展开为4个简单的存储过程,可以根据某些逻辑调用,例如categoryType
IF @categoryType = 'FParty'
BEGIN
exec dbo.InsertFPartyTempData
END
ELSE IF @categoryType = 'SParty'
BEGIN
exec dbo.InsertSPartyTempData
END
... // etc