2010-09-13 47 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

相關問題