2012-07-10 72 views
0

我使用的是SQL Server 2012中正在执行其在存储过程值一起,是否有任何可能的方式来获得存储过程的所有参数与传递给它的值一起?如何获得所有参数名与

我需要这些东西来构建一个XML。我的意思是这应该发生在正在执行的程序中,并且在所有程序中都应该是通用的。

例如,让我们假设我们有程序,

  1. uspSave, @name='test' @age=20
  2. uspDelete @id=2
现在

uspSave过程中,我需要得到@name, @age和值 '测试',20 和uspDelete,我应该得到@id用值2

为了得到列名,我想这一点,

select parameter_name 
from information_schema.PARAMETERS 
where specific_name = OBJECT_NAME(@@procid) 

现在可以遍历上述查询的结果,我们可以得到的值。

+0

你能澄清一下“为什么” - 你的最终目标是什么? – AdaTheDev 2012-07-10 08:42:54

+0

我的目标是用这些参数的值创建一个xml,当发生错误时,我必须将这个xml保存在错误表中 – Harsha 2012-07-10 08:47:45

+0

T-SQL不是富含类似反射设施的语言。按照您的要求编写可重复使用的代码几乎是不可能的。 – 2012-07-10 08:54:18

回答

0

我认为最好的办法是使用一些代码生成,生成您所需要的代码块。

  • 创建存储过程无需代码,XML-IFY参数
  • 敲了一个快速脚本(可以在T-SQL来完成),以进而构建TSQL的特定存储过程块转换参数转换成XML,使用INFORMATION_SCHEMA.PARAMETERS
  • 复制自动生成的脚本的那一点到您的存储过程

您使用动态SQL所想的方式是行不通的因为范围 - 参数就不会是动态生成的SQL中访问,你需要在将它们作为通过sp_executesql的指定参数时,这使你回到广场1

例如

DECLARE @someval int = 7 
EXECUTE('SELECT @someval') -- @someval is not in scope 

所以,如果它有助于节省时间,那么代码gen看起来就像是你最好的选择。

+0

你是男人,那正是我想要的,但太糟糕了,执行官声明的局限性阻止了整个方法。无论如何,我试图通过手动传递参数值来生成XML,我想这是唯一的方法。 – Harsha 2012-07-11 13:49:54