2010-09-13 43 views
2

有没有办法参考集合传递给存储过程的参数,而不用引用每个参数的名字?反正有没有引用传递给存储过程的参数集合,而没有引用每个名称?

这里的上下文是错误记录。我想开发一个通用的CATCH子句或子子句,它捕获所有参数值以及其他错误和执行信息并将其记录到一个表(一个或多个)中。

基本版本看起来是这样的:现在

CREATE PROC dbo.Proc1 @Param1 INT, @Param2 INT 
AS 
BEGIN TRY 
    SELECT 1/0 
END TRY 
BEGIN CATCH 
    DECLARE @params XML 
    SET @params = (
    SELECT 
     @Param1 AS [Param1] 
    , @Param2 AS [Param2] 
    FOR XML PATH('params'), TYPE 
    ) 
    EXEC dbo.LogError @procid = @@PROCID, @params = @params 
    EXEC dbo.RethrowError 
END CATCH 

,这个模板不会工作,除了为每个单独的程序,我将不得不手动编辑SET @params部分。

我可以写一个脚本出来很轻松了,但我仍然需要它复制。

我可以离开某种占位符,然后动态地更新每个定义W/A正确SET声明。我甚至可以编写一个数据库触发器来侦听CREATE和ALTER PROC语句,并让它自动执行此操作。

但我真正想要的只是直接抓取参数集合并完成它。有什么办法吗?

编辑:从系统表中获取参数元数据是不够的。例如:

DECLARE @sql NVARCHAR(MAX) 
SET @sql = 
    'SET @params = (SELECT ' 
+ STUFF((
    SELECT ', '+name+' AS '+STUFF(name,1,1,'') 
    FROM sys.parameters WHERE object_id = @@PROCID 
    FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)') 
    ,1,2,'') 
+ ' FOR XML PATH(''params''), TYPE)' 
-- inline execute here....alas, there's isn't a mode for that 
EXEC sp_executesql @sql, N'@params XML OUTPUT', @params OUTPUT 

这当然,产生一个错误,因为我还没有申报的sp_executesql嵌套范围参数。尽管我可以编写sp_executesql的第二个参数,但是我不能在没有明确地按名称明确指定它们的情况下分配它们。

原来的问题,改写:有的sp_executesql另一种风味继承从外部范围变量“上下文”,即在同一帧中执行,该内联的命令,而不是在嵌套范围执行?

+0

对于哪个版本的SQL Server?表变量或用户定义类型*可能*做你想做的,但你仍然需要填充它们。 – 2010-09-13 05:00:22

+0

@OMG小马,现在我接近它的任何方式我无法摆脱显式变量引用*某处*。为什么T-SQL没有$ frame或$ variables特殊的var?唉。 – 2010-09-13 16:15:30

+0

@Peter:你想要的方法是等待发生的SQL注入攻击 - SQL/TSQL正在保护你免受你自己的攻击。 – 2010-09-13 16:27:18

回答

0

为什么不使用sys.dm_exec_sql_text(@sql_handle)来检索SQL命令,使用sys.sysprocesses.sql_handle?

+0

这只返回当前正在执行的批处理文本。它不提供批次的参数值。 – 2010-09-20 14:39:34

相关问题