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在插入之前首先检查表中是否已经存在?
基本形式是:
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在此处输入现有值并希望用其他列的新信息更新现有员工……如果是这样,您将在不告诉他们的情况下丢弃他们的更新。