我的存储过程有什么问题?

时间:2009-08-16 22:57:27

标签: asp.net sql sql-server sql-server-2008

仅当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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:0)

未声明变量@EmpToUpdateTo。在此之前,您需要将其设为有效变量。

另外,以下一行:

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

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

这是什么意思呢?您似乎正在尝试将tblB中但不在tblA的所有行插入tblB。此查询实际上与@EmpFrom@EmpTo的内容无关,只要它们不相等即可。

答案 3 :(得分:0)

我不是100%肯定我知道你在追求什么。也就是说,如果你试图将tblA中绑定到@EmpFrom的值插入到tblB中,只有在@EmpTo表示的tblB中没有值时,我认为以下内容应该为你做。

你会注意到我从日常工作中清理了一些东西。由于我没有看到@affectedRow二传手的目的,我摆脱了它。此外,您的表别名丢失了,我认为您的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