有没有办法参考集合传递给存储过程的参数,而不用引用每个参数的名字?反正有没有引用传递给存储过程的参数集合,而没有引用每个名称?
这里的上下文是错误记录。我想开发一个通用的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
另一种风味继承从外部范围变量“上下文”,即在同一帧中执行,该内联的命令,而不是在嵌套范围执行?
对于哪个版本的SQL Server?表变量或用户定义类型*可能*做你想做的,但你仍然需要填充它们。 – 2010-09-13 05:00:22
@OMG小马,现在我接近它的任何方式我无法摆脱显式变量引用*某处*。为什么T-SQL没有$ frame或$ variables特殊的var?唉。 – 2010-09-13 16:15:30
@Peter:你想要的方法是等待发生的SQL注入攻击 - SQL/TSQL正在保护你免受你自己的攻击。 – 2010-09-13 16:27:18