【发布时间】:2018-04-11 12:45:18
【问题描述】:
我在 sql server(粗体)中创建 存储过程时遇到以下 斜体错误,
消息 156,级别 15,状态 1,程序 IATF_upload_exce,第 46 行 关键字“AS”附近的语法不正确。 消息 156,级别 15,状态 1,过程 IATF_upload_exce,第 64 行 关键字“SET”附近的语法不正确。 消息 102,级别 15,状态 1,过程 IATF_upload_exce,第 65 行 ',' 附近的语法不正确。 消息 102,级别 15,状态 1,过程 IATF_upload_exce,第 102 行 ',' 附近的语法不正确
存储过程
**-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Shivam_nxf30130
-- Create date: 11April2018
-- Description: IATF_upload_excel
-- =============================================
CREATE PROCEDURE IATF_upload_exce
-- Add the parameters for the stored procedure here
--@p1 int = 0,
--@p2 int = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @name VARCHAR(50) -- database name
--DECLARE @path VARCHAR(256) -- path for backup files
--DECLARE @fileName VARCHAR(256) -- filename for backup
--DECLARE @fileDate VARCHAR(20) -- used for file name
--SET @path = 'C:\Backup\'
--SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR
(SELECT
AU.id AS audit_id,
AT.id AS audittype_id,
CC.id AS CausingClause_id,
IA.[Finding] AS findings,
IA.[Rating] AS Rating,
IA.[Reach(L/R/G)] AS lr_ind,
IA.[Root_Cause] AS root_cause,
IA.[Corrective_Action] AS corr_action,
IA.[Action_Owner] AS by_whom,
IA.[Remark_Verification] AS remarks,
IA.[Links] AS links,
IA.[Close Date] AS close_date
FROM [dbo].[IMPORT_AUDIT_REPORTS_EXCEL] AS IA,
[dbo].[Causing_Clause] AS CC,
[dbo].[Audit_Type] AS AT,
[dbo].[Audits] AS AU
WHERE IA.ID = CC.name
AND IA.Audit_Type = AT.name
AND IA.Audit_No = AU.id) AS Src
--ON Src.ID = dbo.AUDIT_REPORTS .id
--AND Src.audittype_id = dbo.AUDIT_REPORTS .audittype_id
--AND Src.CausingClause_id = dbo.AUDIT_REPORTS .CausingClause_id
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
---SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
--BACKUP DATABASE @name TO DISK = @fileName
--FETCH NEXT FROM db_cursor INTO @name
if(Src.ID = dbo.AUDIT_REPORTS .id
AND Src.audittype_id = dbo.AUDIT_REPORTS .audittype_id
AND Src.CausingClause_id = dbo.AUDIT_REPORTS .CausingClause_id)
UPDATE SET dbo.AUDIT_REPORTS .[audit_id] = Src.audit_id,
dbo.AUDIT_REPORTS .[category_id] = (SELECT id FROM [dbo].CATEGORIES AS CA WHERE CA.name = Src.Rating),
dbo.AUDIT_REPORTS .[ref_id] = 0,
dbo.AUDIT_REPORTS .[ref_ident] = 'N/A',
dbo.AUDIT_REPORTS .[findings] = Src.findings,
dbo.AUDIT_REPORTS .[corr_action] = Src.corr_action,
dbo.AUDIT_REPORTS .[lr_ind] = Src.lr_ind,
dbo.AUDIT_REPORTS .[by_whom] = Src.by_whom,
dbo.AUDIT_REPORTS .[remarks] = Src.remarks,
dbo.AUDIT_REPORTS .[due_date] = NULL,
dbo.AUDIT_REPORTS .[close_date] = Src.close_date,
dbo.AUDIT_REPORTS .[audittype_id] = Src.audittype_id,
dbo.AUDIT_REPORTS .[root_cause] = Src.root_cause,
dbo.AUDIT_REPORTS .[links] = Src.links,
dbo.AUDIT_REPORTS .[CausingClause_id] = Src.CausingClause_id
Else
INSERT
(
[audit_id],
[category_id],
[ref_id],
[ref_ident],
[findings],
[corr_action],
[lr_ind],
[by_whom],
[remarks],
[due_date],
[close_date],
[audittype_id],
[root_cause],
[links],
[CausingClause_id]
)
VALUES
(
Src.audit_id,
(SELECT id FROM [dbo].CATEGORIES AS CA WHERE CA.name = Src.Rating),
0,
'N/A',
Src.findings,
Src.corr_action,
Src.lr_ind,
Src.by_whom,
Src.remarks,
NULL,
Src.close_date,
Src.audittype_id,
Src.root_cause,
Src.links,
Src.CausingClause_id
);
END
CLOSE db_cursor
DEALLOCATE db_cursor
END
GO**
请帮助我解决问题。提前致谢。
【问题讨论】:
-
您应该仔细调查错误消息 AND IA.Audit_No = AU.id) AS Src 和 UPDATE SET 是查询的部分抛出错误。
-
我相信在以这种方式声明变量时(仅当它是数据类型时)不能有别名,并且您需要指定要更新的表名。
-
这不是游标的工作方式,请重新阅读文档。
Src循环中的Src别名没有意义。 -
这看起来像是您从合并语句和 C/P 中获取了一些内容到游标中。您甚至没有在光标末尾获取新行。你确定你需要一个光标吗?
-
嗨 MadBert,感谢您的回复。
标签: sql-server stored-procedures sql-server-2008-r2