将 If 语句添加到存储过程

Red*_*ght 2 sql-server t-sql sql-server-2008-r2

我正在Insert Into我的存储过程中运行一条语句,该语句正在从 a 接收数据Table Value Parameter 我刚刚意识到我需要在执行插入之前首先验证表中不存在数据,因此我试图将我的过程更改为此

ALTER PROC [dbo].[CMT]
(@TempTable AS dbo.TableValue_ET READONLY)
AS
BEGIN

if b.[empID] NOT IN (Select [empID] FROM [Habib].[dbo].[SE])
BEGIN
  INSERT INTO [Habib].[dbo].[SE]([empID],[POD],[empNotes],[hiredate],[terminationdate],[terminationtime],[address],[city],[state])
  SELECT
  [empID]
  ,[POD]
  ,[empNotes]
  ,convert(varchar(10), [b].[hiredate], 101)
  ,convert(varchar(10), [b].[terminationdate], 101)
  ,[terminationtime] = LTRIM(RIGHT(CONVERT(VARCHAR(20), [b].[terminationdate], 100), 7))
  ,[address]
  ,[city]
  ,[state]
  FROM @TempTable b
END

END
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试保存此更新的语法时,出现错误

消息 4104,级别 16,状态 1,过程 UpdateShippingExceptions,第 7 行
无法绑定多部分标识符“b.empID”。

我必须更改什么才能empID在插入之前首先检查表中是否已经存在?

Aar*_*and 5

基本形式是:

INSERT dbo.table
(
  cols
)
SELECT 
  cols
FROM @tvp AS t
WHERE NOT EXISTS 
(
  SELECT 1 FROM dbo.basetable AS b WHERE b.key = t.key
);
Run Code Online (Sandbox Code Playgroud)

在你的情况下,那将是:

INSERT INTO [Habib].[dbo].[SE]
(
  [empID],
  [POD],
  [empNotes],
  [hiredate],
  [terminationdate],
  [terminationtime],
  [address],
  [city],
  [state] /* why do people prefer horizontal scrollbars to vertical ones? */
)
SELECT 
  [empID],
  [POD],
  [empNotes],
  convert(char(10), [b].[hiredate], 101),
  convert(char(10), [b].[terminationdate], 101),
  LTRIM(RIGHT(CONVERT(VARCHAR(20), [b].[terminationdate], 100), 7)),
  [address],
  [city],
  [state]
FROM @TempTable AS b
WHERE NOT EXISTS
(
  SELECT 1 
    FROM [Habib].[dbo].[SE] AS se
    WHERE se.empID = b.empID
);
Run Code Online (Sandbox Code Playgroud)

但是,您需要了解的一件事是,用户是否empID在此处输入现有值并希望用其他列的新信息更新现有员工……如果是这样,您将在不告诉他们的情况下丢弃他们的更新。