Передать переменную таблицы с использованием типа таблицы в хранимую процедуру? - PullRequest
2 голосов
/ 22 января 2020

У меня есть сотрудник таблицы с около 1000 записей, я должен создать хранимую процедуру, которая принимает параметр. Параметр, скорее всего, будет того типа, который я создал «AS Table». Передав переменную таблицы в хранимую процедуру, она должна обновить определенные значения в указанных столбцах c, а изменения должны отразиться в исходной таблице 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, уровень 16, состояние 1, Процедура updateEmpDetails, строка 7 [Batch Start Line 2] Должна объявить скалярную переменную "@UpdateType"

Пожалуйста, помогите мне, где я иду не так.

Мне нужно обновить Таблица сотрудников с использованием хранимой процедуры, которая принимает переменную таблицы.

Если возможно, предоставьте мне правильный код для того же.

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Насколько я могу судить, оператор обновления должен читать

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 с табличной переменной с помощью этого способа записи оператора обновления.

The e в операторе обновления - псевдоним таблицы, присвоенный dbo.employee в предложении FROM. Я мог бы также написать UPDATE dbo.employee [...], это также сработало бы. Обратите внимание, что предложение FROM может иметь несколько ссылок на dbo.employee (для некоторых более сложных операторов), и в этом случае вы обязательно должны использовать псевдоним для обозначения, которое следует использовать в качестве якоря для обновлений. Я просто всегда использую псевдоним, делая SQL операторы более равномерными.

2 голосов
/ 22 января 2020

Вы передаете тип таблицы, поэтому вам нужно присоединиться к нему как к таблице.

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
...