有沒有辦法參考集合傳遞給存儲過程的參數,而不用引用每個參數的名字?反正有沒有引用傳遞給存儲過程的參數集合,而沒有引用每個名稱?
這裏的上下文是錯誤記錄。我想開發一個通用的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