2009-08-16 3 views
-1

Мне нужно вставить выбранные данные от tblA до tblB только в том случае, если выбранных данных не существует в 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 

Надеется, что это помогает, ~ ска

+0

Благодарим вас за помощь. Вы выяснили мой вопрос. – Yves

+0

Ур приветствуется Yonita; poundation! – Hcabnettek

0

Переменная @EmpToUpdateTo не объявлена. Вам нужно будет сделать допустимую переменную до того, как это сработает.

Кроме того, следующая строка:

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

, по сути говоря IF (@EmpFrom <> $EmpTo). Я призываю вас использовать последнее - это быстрее.

Какова цель этого, правда? Похоже, вы пытаетесь вставить все строки, которые не находятся в tblB, но находятся в tblA в tblB. Этот запрос фактически не имеет никакого отношения к тому, что @EmpFrom или @EmpTo есть, только если они не равны.

+0

Спасибо Эрику я буду в первое заявление. Я пытаюсь вставить выбранные данные из раскрывающегося списка A, чтобы вставить t dropdownlistB. Как я могу это сделать? – Yves

0

Я не уверен на 100% Я знаю, что вы после. Тем не менее, если вы пытаетесь вставить значения, привязанные к @EmpFrom в tblA, в tblB только в том случае, если в tblB нет значения, представленного @EmpTo, я думаю, что для вас это должно сделать следующее.

Вы заметите, что я очистил несколько вещей от вашей рутины. Поскольку я не видел цели установщика @affectedRow, я избавился от него. Кроме того, ваши псевдонимы таблицы отсутствовали, и я думаю, что ваши инструкции BEGIN и END, вероятно, вызывают у вас некоторое горе, поскольку у вас были сеттеры @affectRows сразу после IF, но не в BEGIN.

Теперь я предполагаю, что EmpNum - это не только первичный ключ, но и семя идентичности. Если вы хотите вернуть этот новый EmpNum из tblB, лучше всего просто выбрать последнюю вставленную строку 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 имеет 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) 
Смежные вопросы