【发布时间】:2020-10-11 21:11:01
【问题描述】:
我正在尝试使用存储过程更新/插入 SQL 表。它的输入是一个 DataTable 和其他单独的参数。
EmployeeDetails表:
ID | Name | Address | Operation | Salary
---+-------+------------+-------------+------------
1 | Jeff | Boston, MA | Marketing | 95000.00
2 | Cody | Denver, CO | Sales | 91000.00
用户定义表类型(DataTable)的语法:
CREATE TYPE EmpType AS TABLE
(
ID INT,
Name VARCHAR(3000),
Address VARCHAR(8000),
Operation SMALLINT
)
操作流程:
ALTER PROCEDURE spEmpDetails
@Salary Decimal(10,2),
@Details EmpType READONLY
AS
BEGIN
UPDATE e
SET e.Name = d.Name,
e.Address = d.Address
FROM EmployeeDetails e, @Details d
WHERE d.ID = e.ID
--For inserting the new records in the table
INSERT INTO EmployeeDetails(ID, Name, Address)
SELECT ID, Name, Address
FROM @Details;
END
此过程spEmpDetails 将其输入作为单独的参数@Salary 和数据表@Details。使用这些输入,我正在尝试更新/取消插入 EmployeeDetails 表。但是,我未能在更新/插入语句中将这些输入连接在一起。在上面的代码中,我只使用了@Details DataTable 数据来更新EmployeeDetails 表,而我缺少@Salary 来更新表中的数据。
我正在寻找一些关于如何做到这一点的建议。任何建议将不胜感激。
【问题讨论】:
-
您希望表中的所有员工都拥有相同的薪水吗?如果不是,为什么薪水是标量值而不是表值参数的另一列?另外,为什么要使用隐式连接?显式连接成为 ANSI 标准的一部分已有 30 年了,真的没有理由再使用隐式连接了。
-
@ZoharPeled - 感谢您的回复。并非所有员工的薪水都相同,但输入数据表也一次获取一条记录,具体取决于数据表的来源。 “薪水”是从不同的数据源获取到存储过程,但我认为我可以将此薪水添加到数据表源,同时使用其他信息(即 ID、姓名和地址)创建记录。
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 多年前),不鼓励使用它 -
@marc_s。我可以很容易地纠正这个问题,但我的实际问题是如何使用 Insert 语句插入两个数据源值。我认为我们偏离了我最初的问题。
-
正如@ZoharPeled 已经提到的:这里应该如何使用
@Salary变量非常不清楚。将所有员工的工资设置为该值?将要插入的所有员工的工资设置为该值?你需要澄清......
标签: sql sql-server