2012-10-24 65 views
4
DECLARE @temp AS TABLE (id INT NOT NULL PRIMARY KEY CLUSTERED, name VARCHAR(10)) 
BEGIN TRY 
declare @Source table (id int not null, name varchar(10)) 
insert @Source 
    SELECT 11,'ABC' union all 
    SELECT 12,'CDE' union all 
    SELECT 13,'FGH' union all 
    SELECT 11,'IJK' 

INSERT INTO @temp 
SELECT * from @Source 
SELECT * FROM @temp 

END TRY 
BEGIN CATCH 
EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'Profile Name', 
@recipients = '[email protected]', 
@body = Error_Message, 
@subject = Error_Message ; 
END CATCH; 
GO 

這是我的代碼工作正常..但我想在郵件中包含的ID是導致錯誤作爲提醒某些電子郵件ID在這種情況下,它是「11」。 我如何以一些聰明的方式做到這一點..?確定在TSQL中引起約束違反的值/列?

+0

基本上..有可以在它返回的列和數據的任何方法哪些錯誤信息? –

+4

Whar是你的'@@ version'?在2008年(SP3),錯誤消息包含違規值。 '違反PRIMARY KEY約束'PK __#0BC6C43__3213E83F0DAF0CB0'。無法在對象'dbo。@ temp'中插入重複鍵。重複鍵值是(11)。「 –

+0

Microsoft SQL Server 2008 R2(RTM) - 10.50.1617.0(Intel X86)Apr 22 2011 11:57:00 Copyright(c)Windows NT 6.1上的Microsoft Corporation企業版(Build 7601:Service Pack 1) –

回答

3

正如Martin所評論的那樣,2008 SP3以後顯示了重複鍵值。
對於早期版本,您必須檢測可能的主鍵違例並自行提出錯誤,例如, 在一個簡單的方法,我想列名和數據,這是造成主鍵衝突在這種情況下,其11您的具體實例

DECLARE @temp AS TABLE (id INT NOT NULL PRIMARY KEY CLUSTERED, name VARCHAR(10)) 
BEGIN TRY 
declare @Source table (id int not null, name varchar(10)) 
insert @Source 
    SELECT 11,'ABC' union all 
    SELECT 12,'CDE' union all 
    SELECT 13,'FGH' union all 
    SELECT 11,'IJK' 

declare @duplicate_key nvarchar(1000); 
SELECT TOP(1) @duplicate_key = ID 
FROM @Source 
GROUP BY ID 
HAVING COUNT(*) > 1; 
if @duplicate_key is not null 
begin 
    set @duplicate_key = 
    'Violation of PRIMARY KEY constraint. '+ 
    'Cannot insert duplicate key in object ''[email protected]''. '+ 
    'The duplicate key value is (' + right(@duplicate_key,10) + ')'; 
    RAISERROR(@duplicate_key, 
      16, 
      1); 
end; 

INSERT INTO @temp 
SELECT * from @Source 

SELECT * FROM @temp 

END TRY 
BEGIN CATCH 
select Error_Message() ; 
END CATCH; 
GO 
+0

http://www.simple-talk.com/sql/t-sql-programming/handling-constraint-violations-and-errors-in-sql-server/非常詳細的文章,我發現谷歌..它符合我的要求正如我想要多個錯誤存在但我擔心處理成本.. –