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@email.com', 
 @body = Error_Message, 
 @subject = Error_Message ; 
END CATCH;
GO

これは正常に動作する私のコードです..しかし、メールに含めたいのはIDであり、この場合は「11」です. どうすればこれをスマートな方法で行うことができますか..?

4

1 に答える 1

3

Martinがコメントしているように、2008SP3以降は重複するキー値を示しています。
以前のバージョンでは、主キー違反の可能性を検出し、エラーを自分で発生させる必要があります。たとえば、特定の例の場合などです。

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 ''dbo.@temp''. '+
    '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
于 2012-10-24T09:41:57.287 に答える