Процедура вставки / обновления выдает неверное имя столбца Ошибка SQL Server - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь создать процедуру, которая использует функцию слияния либо обновляет, либо вставляет записи в таблицу.Процедура создана, но когда я пытаюсь проверить ее, я получаю следующие ошибки: enter image description here Столбцы существуют.

CREATE TABLE ProjectBilling
(
    projectBillID CHAR(6),
    TransAmount DECIMAL(16,9),
    TransDesc VARCHAR(255),
    TransDate DATETIME, 
    projectID CHAR(4),
    accountMgr CHAR(8),

    PRIMARY KEY (projectBillID)
)
GO

CREATE OR ALTER PROCEDURE SP_AddUpdateProjectBill
    @projectBillID CHAR(6),
    @TransAmount DECIMAL(16,9),
    @TransDesc VARCHAR(255),
    @TransDate DATETIME,
    @projectID CHAR(4),
    @accountMgr CHAR(8)
AS
BEGIN
    SELECT * 
    INTO ProjectBillingSource 
    FROM ProjectBilling

    INSERT INTO ProjectBillingSource ('projectBillID', 'TransAmount', 'TransDesc', 'TransDate', 'projectID', 'accountMgr')
    VALUES (@projectBillID, @TransAmount, @TransDesc, @TransDate, @projectID, @accountMgr)


    MERGE ProjectBilling AS T
    USING ProjectBillingSource AS S ON T.projectBillID = S.projectBillID

    WHEN MATCHED THEN
        UPDATE SET T.projectBillID = S.projectBillID,
               T.TransAmount = S.TransAmount,
               T.TransDesc = S.TransDesc,
               T.TransDate = S.TransDate,
               T.projectID = S.projectID,
               T.accountMgr = S.accountMgr

    WHEN NOT MATCHED BY TARGET THEN
        INSERT(projectBillID,TransAmount,TransDesc,TransDate,projectID,accountMgr) 
        VALUES(S.projectBillID, S.TransAmount, S.TransDesc, S.TransDate, S.projectID, S.accountMgr);
END

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Вы получаете сообщение об ошибке, поскольку при вставке данных в таблицу ProjectBillingSource вы указали столбец в одинарной кавычке, имя столбца следует указывать без одинарной кавычки.

INSERT INTO ProjectBillingSource(**'projectBillID', 'TransAmount', 'TransDesc', 'TransDate', 'projectID', 'accountMgr'**)
VALUES (@projectBillID, @TransAmount, @TransDesc, @TransDate, @projectID, @accountMgr)

Обновите оператор вставки безцитата, подобная этой -

INSERT INTO ProjectBillingSource (projectBillID, TransAmount, TransDesc, TransDate, projectID, accountMgr)
VALUES (@projectBillID, @TransAmount, @TransDesc, @TransDate, @projectID, @accountMgr)

Кроме того, вы должны создавать таблицу только тогда, когда она не существует, как это -

if OBJECT_ID('ProjectBillingSource') is null
begin
    SELECT * INTO ProjectBillingSource FROM ProjectBilling
end
0 голосов
/ 18 марта 2019

Обновите вашу хранимую процедуру, как показано ниже

CREATE OR ALTER PROCEDURE SP_AddUpdateProjectBill

     @projectBillID char(6),
     @TransAmount decimal(16,9),
     @TransDesc varchar(255),
     @TransDate datetime,
     @projectID char(4),
     @accountMgr char(8)

AS
BEGIN

Declare @ProjectBillingSource Table
(
     ProjectBillID char(6),
     TransAmount decimal(16,9),
     TransDesc varchar(255),
     TransDate datetime,
     ProjectID char(4),
     AccountMgr char(8)
);

--SELECT * INTO ProjectBillingSource FROM ProjectBilling

Insert Into @ProjectBillingSource([ProjectBillID],[TransAmount],[TransDesc],[TransDate],[ProjectID],[AccountMgr])
VALUES(@projectBillID, @TransAmount, @TransDesc, @TransDate, @projectID, @accountMgr)


MERGE ProjectBilling AS T
USING @ProjectBillingSource AS S
ON T.projectBillID = S.projectBillID
WHEN MATCHED THEN
    UPDATE SET T.projectBillID = S.projectBillID,
               T.TransAmount = S.TransAmount,
               T.TransDesc = S.TransDesc,
               T.TransDate = S.TransDate,
               T.projectID = S.projectID,
               T.accountMgr = S.accountMgr

WHEN NOT MATCHED BY TARGET THEN
    INSERT(projectBillID,TransAmount,TransDesc,TransDate,projectID,accountMgr) Values(S.projectBillID, S.TransAmount, S.TransDesc, S.TransDate, S.projectID, S.accountMgr);
end
0 голосов
/ 18 марта 2019

Пожалуйста, попробуйте эту обновленную хранимую процедуру.

Create  Table ProjectBilling
(
projectBillID char(6),
TransAmount decimal(16,9),
TransDesc varchar(255),
TransDate datetime, 
projectID char(4),
accountMgr char(8),

PRIMARY KEY (projectBillID)
)
go

IF EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE NAME ='SP_AddUpdateProjectBill')
BEGIN
        DROP PROCEDURE SP_AddUpdateProjectBill
END
GO
CREATE PROCEDURE SP_AddUpdateProjectBill
     @projectBillID char(6),
     @TransAmount decimal(16,9),
     @TransDesc varchar(255),
     @TransDate datetime,
     @projectID char(4),
     @accountMgr char(8)

AS
BEGIN


SELECT * INTO ProjectBillingSource FROM ProjectBilling

Insert Into ProjectBillingSource('projectBillID','TransAmount','TransDesc','TransDate','projectID','accountMgr')
VALUES(@projectBillID, @TransAmount, @TransDesc, @TransDate, @projectID, @accountMgr)


MERGE ProjectBilling AS T
USING ProjectBillingSource AS S
ON T.projectBillID = S.projectBillID
WHEN MATCHED THEN
    UPDATE SET T.projectBillID = S.projectBillID,
               T.TransAmount = S.TransAmount,
               T.TransDesc = S.TransDesc,
               T.TransDate = S.TransDate,
               T.projectID = S.projectID,
               T.accountMgr = S.accountMgr

WHEN NOT MATCHED BY TARGET THEN
    INSERT(projectBillID,TransAmount,TransDesc,TransDate,projectID,accountMgr) Values(S.projectBillID, S.TransAmount, S.TransDesc, S.TransDate, S.projectID, S.accountMgr);
end

Ваша ошибка ниже не сработала.

CREATE OR ALTER PROCEDURE SP_AddUpdateProjectBill 

Заменить на вышеуказанное условие.

IF EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE NAME ='SP_AddUpdateProjectBill')
BEGIN
        DROP PROCEDURE SP_AddUpdateProjectBill
END
GO
CREATE PROCEDURE SP_AddUpdateProjectBill
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...