2009-08-16 13 views
-1

Ich muss die ausgewählten Daten nur dann von tblA in tblB einfügen, wenn die ausgewählten Daten in tblB nicht vorhanden sind. Ich habe eine Schaltfläche erstellt, die diese gespeicherte Prozedur ausführt.
Ich kann nicht herausfinden, was ich in meiner gespeicherten Prozedur falsch mache, es fügt nicht/nicht vorhandene Daten in tblB ein.Was ist falsch an meiner gespeicherten Prozedur?

Ich verwende SQL Server 2008 und 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 

Antwort

1

es auf diese Weise versuchen

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 

hoffe, das hilft, ~ ck

+0

Vielen Dank für Ihre Hilfe. Du hast es herausgefunden, meine Frage. – Yves

+0

Ur willkommen Yonita; poundation! – Hcabnettek

0

Die Variable ist nicht deklariert. Sie müssen dies zu einer gültigen Variable machen, bevor dies funktioniert.

Auch die folgende Zeile ein:

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

im Wesentlichen IF (@EmpFrom <> $EmpTo) sagt. Ich ermutige Sie, das letztere zu benutzen - es ist schneller.

Was ist die Absicht davon? Es sieht so aus, als ob Sie versuchen, alle Zeilen einzufügen, die nicht in tblB sind, aber in tblA in tblB sind. Diese Abfrage hat tatsächlich keinen Einfluss darauf, was oder @EmpTo sind, nur solange sie nicht gleich sind.

+0

Danke Eric werde ich mit der ersten Anweisung. Ich versuche, die ausgewählten Daten aus DropDropListeA einzufügen, um DropDownlistB einzufügen. Wie kann ich das machen? – Yves

0

Ich bin nicht 100% sicher Ich weiß, was Sie wollen. Wenn Sie jedoch versuchen, die an @EmpFrom in tblA gebundenen Werte nur dann in tblB einzufügen, wenn in tblB kein Wert für @EmpTo steht, sollte das folgende für Sie gelten.

Sie werden feststellen, dass ich ein paar Dinge aus Ihrer Routine bereinigt. Da ich den Zweck des @affectedRow-Setters nicht gesehen habe, habe ich ihn losgeworden. Außerdem fehlten die Aliase Ihrer Tabelle, und ich denke, dass Ihre BEGIN- und END-Anweisungen Ihnen wahrscheinlich etwas Kummer bereiten, da Sie die @affectRows-Setter unmittelbar nach der IF hatten, aber nicht innerhalb der BEGIN.

Nun, meine Vermutung ist, dass EmpNum nicht nur der Primärschlüssel ist, sondern eine Identität Samen. Wenn Sie dieses neue EmpNum von tblB zurückgeben möchten, ist es wahrscheinlich am besten, die zuletzt eingefügte tblB-Zeile wie im folgenden Skript auszuwählen. Alternativ können Sie nur den neuen Wert mit Select @@ identity zurückgeben.

Gosh, ich hoffe ich verstehe deine Frage richtig. Viel Glück.

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 hat die MERGE Aussage, die Ihnen erlaubt, zu aktualisieren, einfügen und Daten löschen alle in einer Erklärung. In Ihrem Fall können Sie damit Daten einfügen, die in tblB nicht existieren, aber in tblA existieren. Die Syntax lautet wie folgt:

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) 
Verwandte Themen