SQL 服务器存储过程语法错误



我正在尝试编写一个存储过程,该过程返回特定人员的存款记录,该人的存款数量以及该人的存款行号。参数@personID始终提供正确的 personID;但是@SpecificRow要么是 0(意思是:返回最近的存款(要么是行号(意思是:返回此特定行的记录(。

脚本:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [schema].[procedure]
@personID varchar(5),
@SpecificRow int,
@RowNumber INT OUTPUT,
@RowCount INT OUTPUT
AS
BEGIN
IF OBJECT_ID('#TempSortedDeposits') IS NOT NULL 
DROP Table #TempSortedDeposits
-- get all deposits with record number into temp file for specific personID
SELECT 
ROW_NUMBER() OVER (ORDER BY Date ASC) AS RecordNo, *
INTO 
#TempSortedDeposits
FROM 
persons.Deposits
WHERE 
personID = @personID
-- get record count in file
SELECT @RowCount = COUNT(personID)
FROM persons.Deposits
WHERE personID = @personID 
IF @SpecificRow = 0 --get most recent record
SET @RowNumber = @RowCount;
ELSE
--get record by rownumber
SET @RowNumber = @SpecificRow;
SELECT * 
FROM #TempSortedDeposits 
WHERE RecordNo = ­@RowNumber
END

当我尝试运行 alter 语句时,出现以下错误:

Msg 102,级别 15,状态 1,过程过程,第 33 行 [批处理开始行 9]
'' 附近的语法不正确。

有什么见解吗?

谢谢。

SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber删除了这一行并手动重新键入它,然后它就可以工作了。

这是因为错误是由于复制和粘贴而发生的。粘贴代码的结果包含不可打印的字符,例如 d 非制动空格。

只是一个旁注...您的#TempSortedDeposits桌像您想象的那样下降。

下面是一个快速示例:

create table #TempSortedDeposits (i int)
insert into #TempSortedDeposits
values
(1)
IF OBJECT_ID('#TempSortedDeposits') IS NOT NULL DROP TABLE #TempSortedDeposits
select * from #TempSortedDeposits

如果你第一次运行它,它将在不应该的时候返回 1,因为它应该被删除。在第二次运行(同一连接(时,您将收到此错误,显示该表仍然存在且未被删除:

Msg 2714,级别 16,状态 6,第 2 行 已存在一个名为 数据库中的"#TempSortedDeposits"。

若要解决此问题,请将语法更改为:

IF OBJECT_ID('tempdb..#TempSortedDeposits') IS NOT NULL DROP TABLE #TempSortedDeposits

这是一个测试

create table #TempSortedDeposits (i int)
insert into #TempSortedDeposits
values
(1)
IF OBJECT_ID('tempdb..#TempSortedDeposits') IS NOT NULL DROP TABLE #TempSortedDeposits
select * from #TempSortedDeposits

如果您首先手动删除表(因为我们在上次运行时创建了它(,然后运行以下命令,您将收到错误消息:

消息 208,级别 16,状态 0,第 7 行 对象名称无效 "#TempSortedDeposits"。

这意味着选择失败,从而表明该表实际上已被删除。

我已经删除了下面行中存在的额外字符并重新执行此过程。 从 #TempSortedDeposits 中选择 *,其中记录编号 = @RowNumber

最新更新