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