1

我花了过去几个小时寻找解决方案,但仍然没有找到一个好的解决方案。

我的问题很简单。我在 T SQL (SQL Server 2008 R2) 中编写了一些非常大的存储过程,我必须在同INSERT一个存储过程中多次重复使用相同的存储过程。目标表有大量的列。

我尝试将动态查询定义为varchar变量。然后用 执行它sp_execute,指定所有参数,它就可以工作了。但这不是理想的解决方案,因为每当我需要调用它时,我每次都必须使用相同数量的参数来复制调用。

我正在寻找的是一种定义INSERT要执行的方法,指定要使用的变量,然后只需一行代码就可以调用它,而无需再次指定参数。

我想知道是否有人可以指出我在代码重用和可读性方面更有效的解决方案。

提前致谢

4

2 回答 2

1

CLR 用户定义类型可能是一个很好的答案:http: //msdn.microsoft.com/en-us/library/ms131120.aspx

您将定义一个具有与您的参数相对应的属性的 UDT,然后您将创建一个存储过程(一个常规的 T-SQL 过程将起作用),它将您的 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
于 2013-07-05T18:00:50.437 回答
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
于 2013-07-05T18:53:35.993 回答