在SQL SERVER中替换动态查询的可能方法是什么?

时间:2015-07-13 09:37:26

标签: sql-server

我有一个使用动态查询实现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

上面的代码工作正常,但需要替换过程的动态性质。请提出任何概念。

1 个答案:

答案 0 :(得分:0)

用于构建以逗号分隔的列列表的表/游标是过度的,就像主要的过度杀伤一样。

您可以考虑将逻辑展开为4个简单的存储过程,可以根据某些逻辑调用,例如categoryType

IF @categoryType = 'FParty'
BEGIN
    exec dbo.InsertFPartyTempData 
END
ELSE IF @categoryType = 'SParty'
BEGIN
    exec dbo.InsertSPartyTempData 
END
... // etc
相关问题