2009-08-16 6 views
-1

選択したデータがtblBに存在しない場合にのみ、tblAからtblBまでの選択したデータを挿入する必要があります。このストアドプロシージャを実行するボタンを作成しました。
私は自分のストアドプロシージャで何が間違っているのか分かりません。tblBに既存のデータを挿入/表示していません。私のストアドプロシージャに問題がありますか?

私はSQL Server 2008とASP.NETを使用しています。

CREATE PROCEDURE [dbo].[ADDATA] 
@EmpFrom varchar(7) 
,@EmpTo varchar(7) 
AS 
SET NOCOUNT ON; 
DECLARE @affectedRows int 
SET @affectedRows = 0; 
BEGIN 
    IF NOT EXISTS (SELECT 1 FROM [dbo].[tblA] WHERE @EmpFrom = @EmpTo) 
    SET @affectedRows = @affectedRows + @@ROWCOUNT 

BEGIN 
INSERT INTO tblB 
(EmpNum --- PK 
,Last_First 
,Title 
,NTUserName) 
select 
@EmpTo 
,a.emp_name_lfn 
,a.job_title 
,a.[user_id] 
FROM tblA 
    END 
END 

答えて

1

このよう

CREATE PROCEDURE [dbo].[ADDATA] 
@EmpTo varchar(7) 
AS 
SET NOCOUNT ON; 
DECLARE @affectedRows int 
SET @affectedRows = 0; 
    BEGIN  
    IF NOT EXISTS (SELECT * FROM [dbo].[tblB] WHERE EmpNum = @EmpTo) 
     BEGIN 
     INSERT INTO tblB(EmpNum, Last_First, Title, NTUserName) 
     SELECT @EmpTo, emp_name_lfn, job_title, [user_id] 
     FROM tblA 
     WHERE [Whatever_The_EmpNum_Field_Is_Named_In_tblA] = @EmpTo 
     SET @affectedRows = @affectedRows + @@ROWCOUNT 
     END 
    END 

それを試してみてください希望、これは助け、 〜CK

+0

ご協力いただきありがとうございます。あなたはそれを私の質問から理解しました。 – Yves

+0

よろしくお願いします。打ち切り! – Hcabnettek

0

変数@EmpToUpdateToは宣言されていません。これが有効になる前に、それを有効な変数にする必要があります。

はまた、次の行:

IF NOT EXISTS (SELECT 1 FROM [dbo].[tblA] WHERE @EmpFrom = @EmpTo) 

は、本質的にIF (@EmpFrom <> $EmpTo)を言っています。私はあなたが後者を使用することをお勧めします - それは速いです。

これはどういう意味ですか? tblBにはないが、tblAにある行はすべて、tblBに挿入しようとしているようです。このクエリは実際には@EmpFromまたは@EmpToには関係しません。同じでないかぎりです。

+0

は、最初の文に、私は意志あなたにエリックをありがとうございます。 dropdownlistBを挿入するためにdropdownlistAから選択したデータを挿入しようとしています。どうやってやるの? – Yves

0

私はあなたが何をしているかを知っています。つまり、@ EmpToで表されるtblBの値がない場合に限り、tblAの@EmpFromに結び付けられた値をtblBに挿入しようとしている場合、次のようにしてください。

あなたのルーチンからいくつかのものを整理しました。私は@affectedRowセッターの目的を見ていないので、私はそれを取り除いた。また、テーブルのエイリアスがなくなっていました.BEGINとENDステートメントは、IFの直後に@affectRowsセッターを持っていて、BEGINの中にはないので、おそらくあなたに悲しみを引き起こしていると思います。

私の推測では、EmpNumはプライマリキーではなく、IDシードであると考えられます。あなたがtblBからこの新しいEmpNumを返そうとしている場合は、下のスクリプトで行ったように、最後に挿入されたtblB行を選択するのが最善の方法でしょう。または、Select @@ identityを使用して新しい値だけを返すこともできます。

おっと、私はあなたの質問を正しく理解することを願っています。運が良かった。

CREATE PROCEDURE [dbo].[ADDATA] 
    @EmpFrom varchar(7) --ddlA, 
    @EmpTo varchar(7) --ddlB 
AS 

SET NOCOUNT ON; 

DECLARE @affectedRows int; 
SET @affectedRows = 0; 

IF NOT EXISTS (SELECT 1 FROM [dbo].[tblB] WHERE EmpNum = @EmpTo) --ddl key id  

BEGIN 
    INSERT INTO tblB (Last_First, Title, NTUserName) 
    SELECT a.emp_name_lfn, a.job_title, a.[user_id] 
    FROM tblA a  
    WHERE a.EmpNum = @EmpFrom 

    SELECT EmpNum, Last_First, Title, NTUserName 
    FROM tblB 
    WHERE EmpNum = @@identity 
END 
3

SQL Server 2008では、あなたは、更新、挿入、およびすべての1つのステートメントでデータを削除することができますMERGE文を持っています。あなたの場合は、tblBに存在しないがtblAに存在するデータを挿入するために使用することができます。構文は次のとおりです。

MERGE tblB AS Target 
USING 
(
SELECT EmpNum ,Last_First ,Title ,NTUserName 
FROM tblA 
) AS Source 
ON (Source.EmpNum = Target.EmpNum) 
-- Empnum exists in source and target, update all fields from source to target 
WHEN MATCHED THEN 
UPDATE SET 
Target.Last_First = Source.Last_First, 
Target.Title = Source.Title, 
Target.NTUserName = Source.NTUserName 
-- No records exist in target table, insert them from source 
WHEN NOT MATCHED 
INSERT (EmpNum ,Last_First ,Title ,NTUserName) 
VALUES(Source.EmpNum, Source.Last_First, Source.Title, Source.NTUserName) 
関連する問題