我花了最后几个小时寻找解决方案,但仍然没有找到一个好的解决方案。
我的问题很简单。我在T SQL(SQL Server 2008 R2)中编写了一些非常大的存储过程,我必须在同一个存储过程中重复使用相同的INSERT
。目标表具有大量列。
我尝试将动态查询定义为varchar
变量。然后用sp_execute
执行它,指定所有参数并且它可以工作。但它不是理想的解决方案,因为每当我需要调用它时,我每次都必须使用相同数量的参数复制调用。
我正在寻找的是一种定义要执行的INSERT
的方法,指定要使用的变量,然后只需一行代码就可以调用它,而无需指定再次参数。
我想知道是否有人可以指出我在代码重用和可读性方面更有效的解决方案。
提前致谢
答案 0 :(得分:1)
CLR用户定义的类型可能是一个很好的答案:http://msdn.microsoft.com/en-us/library/ms131120.aspx
您将使用与您的参数对应的属性定义UDT,然后您将创建一个存储过程(常规T-SQL proc将起作用),它将UDT的实例作为参数然后执行插入,如这样:
CREATE PROCEDURE dbo.InsertProc(@params MyUDT)
AS
INSERT INTO dbo.T1 (a, b, c, d, e, f)
VALUES (@params.a, @params.b, @params.c, @params.d, @params.e, @params.f);
然后你的主要程序会做这样的事情:
DECLARE @myParams AS MyUDT
-- call insert with initial parameters
SELECT @myParams.a = 1, @myParams.b = 2, @myParams.c = 3, @myParams.d = 4, @myParams.e = 5, @myParams.f = 6
EXEC dbo.InsertProc @myParams
-- change parameters a and b and call again
SELECT @myParams.a = 10, @myParams.b = 20
EXEC dbo.InsertProc @myParams
答案 1 :(得分:0)
您可以创建一个根据您的需要量身定制的临时存储过程。我认为您需要使用动态SQL来生成临时存储过程。这是一个例子sqlfiddle:
create table T (a int, b int, c int, d int, e int);
create proc InsertIntoT
@a int,
@b int,
@c int,
@d int
as begin
declare @procedureContents varchar(max) = '
create proc #TempInsert
@e int
as
insert T values (' + cast(@a as varchar(max))
+ ', ' + cast(@b as varchar(max))
+ ', ' + cast(@c as varchar(max))
+ ', ' + cast(@d as varchar(max))
+ ', @e)'
exec( @procedureContents)
exec #TempInsert 1
exec #TempInsert 2
exec('drop proc #TempInsert')
end;
exec InsertIntoT 2, 3, 4, 5;
exec InsertIntoT 3, 3, 3, 3;
select * from T