2009-08-16 81 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 2009-08-17 16:17:49

+0

Ur欢迎Yonita; poundation! – Hcabnettek 2009-08-17 16:38:48

0

变量@EmpToUpdateTo未被声明。在这个工作之前,你需要做一个有效的变量。

此外,以下行:

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

基本上是说IF (@EmpFrom <> $EmpTo)。我鼓励你使用后者 - 速度更快。

虽然这有什么意图?它看起来像你试图插入所有不在tblB但在tblAtblB的行。这个查询实际上与@EmpFrom@EmpTo不相关,只要它们不相等即可。

+0

谢谢埃里克我会去的第一个语句。 我想从dropdownlistA中插入选定的数据来插入t dropdownlistB。我怎样才能做到这一点? – Yves 2009-08-16 23:21:18

0

我不是100%确定我知道你在做什么。也就是说,如果您试图将tblA中与@EmpFrom关联的值插入tblB,那么只有在@EmpTo所表示的tblB中没有值时,我认为以下内容才适合您。

你会注意到我从日常工作中清理了一些东西。由于我没有看到@affectedRow setter的用途,我摆脱了它。另外,您的表别名已丢失,我认为您的BEGIN和END语句可能会导致您一些悲伤,因为您在IF之后立即设置了@affectRows设置器,但不在BEGIN之内。

现在,我的猜测是,EmpNum不仅是主键,还是身份种子。如果你正在寻找从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中有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)