我试图创建一个使用合并功能更新或将记录插入表中的过程。该过程已创建,但是每当我尝试对其进行测试时,都会出现以下错误:
这些列确实存在。
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
答案 0 :(得分:1)
收到错误消息是因为在表'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
答案 1 :(得分:0)
请尝试使用此更新的存储过程。
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
答案 2 :(得分:0)
如下更新您的存储过程
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