【问题标题】:Pass a table variable using table type into a stored procedure?使用表类型将表变量传递给存储过程?
【发布时间】:2020-05-08 09:37:00
【问题描述】:

我有一个大约有 1000 个条目的表员工,我必须创建一个接受参数的存储过程。该参数很可能是我创建的“AS Table”类型。将表变量传递到存储过程后,它应该更新特定列中的某些值,并且更改应该反映在原始 Employee 表中。

我尝试了以下步骤:

USE testDB
GO

CREATE TYPE dbo.UpdateTableType AS TABLE(Id BIGINT NULL, Designation varchar(50) NULL, Salary varchar(50) NULL)

DECLARE @employeeTable TABLE(Id BIGINT, Designation varchar(50), Salary varchar(50))

INSERT INTO @employeeTable
    VALUES 
        (2, 'Sales', '$8002'),
        (7, 'Sales DPO', '$8007'),
        (9, 'Sales Mgr', '$8009')

Select * from @employeeTable

以上是针对表格类型和表格变量的

现在,对于我尝试过的存储过程,

CREATE PROCEDURE updateEmpDetails
    @UpdateType UpdateTableType READONLY
AS
BEGIN
    UPDATE dbo.employee
        SET 
            dbo.employee.Designation = @UpdateType.Designation,
            dbo.employee.Salary = @UpdateType.Salary
        WHERE
            @UpdateType.Id = dbo.employee.[Employee ID]
END

Msg 137, Level 16, State 1, Procedure updateEmpDetails, Line 7 [Batch Start Line 2] 必须声明标量变量“@UpdateType”

请帮我看看我哪里出错了。

我需要使用接受表变量的存储过程更新Employee Table

如果可能,请向我提供相同的正确代码。

【问题讨论】:

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

您传递的是表格类型,因此您需要将其作为表格加入。

UPDATE e
SET e.Designation = u.Designation,
    e.Salary = u.Salary

FROM dbo.employee e
INNER JOIN @UpdateType u ON e.[Employee ID] = u.Id

全码:

CREATE PROCEDURE updateEmpDetails
    @UpdateType UpdateTableType READONLY
AS
BEGIN
    UPDATE e
    SET e.Designation = u.Designation,
        e.Salary = u.Salary

    FROM dbo.employee e
    INNER JOIN @UpdateType u ON e.[Employee ID] = u.Id
END

【讨论】:

  • 这里的'e'是什么意思?
  • 根据dbo.employee是表别名
【解决方案2】:

据我所知,更新语句应该是

CREATE PROCEDURE updateEmpDetails
    @UpdateType UpdateTableType READONLY
AS
BEGIN    
    UPDATE 
        e
    SET 
        Designation = u.Designation,
        Salary = u.Salary
    FROM
        dbo.employee AS e
        INNER JOIN @UpdateType AS u ON
            u.Id=e.[Employee ID];
END

所以用这种写更新语句的方式将employee表和表变量连接起来。

update 语句中的e 是FROM 子句中分配给dbo.employee 的表别名。我也可以写UPDATE dbo.employee [...],这样也行。请注意,FROM 子句可以有多个对dbo.employee 的引用(对于一些更复杂的语句),在这种情况下,您绝对应该使用别名来表示哪个应该用作更新的锚点。我只是一直使用别名,让 SQL 语句更加统一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2012-09-03
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多