-1

私の教授は、ストアド プロシージャまたはトリガーを使用して、新しい従業員が挿入されるたびに、null 以外のコンピューターが少なくとも 1 つ割り当てられるようにするように私に求めています。 http://i1294.photobucket.com/albums/b618/uRsh3RRaYm0nD/Capturescreenie_zps67ab757a.jpg テーブル レイアウトは次のとおりです。

コンピュータテーブル

SerialNumber_PK,
Make,
Model

Computer_Employee テーブル

SerialNumber_PK_FK,
EmployeeNumber_PK_FK,
DateAssigned

従業員テーブル

EmployeeNumber_PK,
FirstN,
LastN,
Department_FK,
Phone,
Email,

ストアド プロシージャを使用することにしましたが、行き詰まっており、これが正しいかどうかわかりません。

CREATE PROCEDURE sp_AddEmployee
(   @EmployeeNumber Int,
    @FirstName  Char(25),
    @LastName   Char(25),
    @Department Char(35),
    @Phone  Char(12),
    @Email  VarChar(100))
AS
DECLARE @rowcount AS Int

SELECT @rowcount = COUNT(*)
FROM EMPLOYEE AS E
WHERE E.EmployeeNumber = @EmployeeNumber
IF @rowcount > 0
    Begin
        PRINT ' '
        PRINT 'The employee with employee number: '
        PRINT ' '
        PRINT Str(@EmployeeNumber)
        PRINT ' '
        PRINT 'already exists in the EMPLOYEE table.'
        RETURN;
    END;
    
DECLARE @pc_rowcount AS Int
SELECT @pc_rowcount = COUNT(*)
FROM COMPUTER_ASSIGNMENT AS C
WHERE C.EmployeeNumber = @EmployeeNumber
IF @pc_rowcount = 0
    BEGIN
        PRINT ' '
        PRINT ' '
        PRINT 'A computer serial number must be assigned to the added employee'
        PRINT 'number in the computer assignment table'
        PRINT ' '
        PRINT ' '
        RETURN;
    END;
IF @pc_rowcount > 0
    BEGIN 
        INSERT INTO EMPLOYEE
                (EmployeeNumber, FirstName, LastName, Department, Phone,
                 Email)
        VALUES(@EmployeeNumber, @FirstName, @LastName, @Department, @Phone,
                @Email);
        PRINT '*******************************************************'
        PRINT ' '
        PRINT 'The employee with employee number: '
        PRINT ' '
        PRINT Str(@EmployeeNumber)
        PRINT ' '
        PRINT 'has been added to the EMPLOYEE table.'
        PRINT ' '
        PRINT '*******************************************************'
    END;
4

2 に答える 2

0

一般的な規則:EXISTSデータの有無を確認したいが、明示的な を必要としない場合に使用しますCOUNT。ストアド プロシージャに名前を付けないでくださいsp_MyName

編集:追加のクレジットのトランザクションを追加しました。

create procedure AddEmployee(
  @EmployeeNumber Int,
  @FirstName VarChar(25),
  @LastName VarChar(25),
  @Department VarChar(35),
  @Phone VarChar(12),
  @Email VarChar(100) )
as

  set nocount on

  begin transaction

  if exists ( select 42 from Employee where EmployeeNumber = @EmployeeNumber )
    begin
    rollback transaction
    RaIsError( 'Employee #' + Cast( @EmployeeNumber as VarChar(10) ) + ' already exists.', 13, 0 )
    end

  if not exists ( select 42 from Computer_Assignment where EmployeeNumber = @EmployeeNumber )
    begin
    rollback transaction
    RaIsError( 'Employee #' + Cast( @EmployeeNumber as VarChar(10) ) + ' has no computer.', 13, 1 )
    end

  insert into Employee ( EmployeeNumber, FirstName, LastName, Department, Phone, Email )
    values ( @EmployeeNumber, @FirstName, @LastName, @Department, @Phone,  @Email );

  commit transaction

また、カスケード削除について教えられたことすべてが良い考えであると信じないでください。

于 2013-06-05T01:16:57.107 に答える
0

トランザクションを使用したスト​​アド プロシージャにより、かなりの作業を節約できます。

トランザクションを開始するだけです->従業員を挿入します->最後の挿入IDを変数に保存します->コンピューターテーブルのシリアル番号とコンピューター_従業員のシリアル番号の違いを実行し、そのtop()を取得して変数に保存します->これらの両方の変数を挿入します現在の日付関数を使用して computer_Employee テーブルに

トリガーでも同じことができますが、個人的には、常に機能していましたが、挿入 ID を取得するときにトリガーを使用することを信頼したことはありません。

また、これはあなたのemployeeIDがauto_Incであることを前提としています

編集:パラメータリストに含めているのではないので、それを使用してください

于 2013-05-25T05:39:48.510 に答える