SQL Server存储过程语法错误
我想写一个存储过程返回存款记录一个特定的人,存款的那个人,并且存款的那个人的行数目。参数@personID
总是提供正确PERSONID;然而@SpecificRow
是0(意思是:返回最近的存款)或行号(意思是:在这个特定的行返回记录)。SQL Server存储过程语法错误
脚本:
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, Level 15, State 1, Procedure procedure, Line 33 [Batch Start Line 9]
Incorrect syntax near ''.
任何见解?
谢谢。
我删除了这条线SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber
和手动重新输入那么它的工作。
这是因为错误的发生是由于复制和粘贴。该结果到粘贴代码包含不可打印的字符等 d非制动空格。
谢谢。你是如何认定这条线是问题的? – ti034
因为这个错误的附近‘“附近有语法错误'。由非打印字符,如无后打印出来几乎总是被调用’。 –
只是一个侧面说明...你#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, Level 16, State 6, Line 2 There is already an object named '#TempSortedDeposits' in the database.
为了解决这个问题,语法更改为:
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
如果您先手动删除该表(因为我们用最后的运行创造了它),然后运行它,您将收到错误消息:
Msg 208, Level 16, State 0, Line 7 Invalid object name '#TempSortedDeposits'.
这意味着选择失败,从而表明该表实际上下降了。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROCEDURE [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
--corrected the proc
您删除从PROC名称的模式,并且应该解决它? – scsimon
我已经删除了下面一行中的额外字符并重新执行此过程。线是 SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber
检查什么传递给帕拉姆@personID? –
@FullMoonFisher这不应该造成编译错误,只是执行。 – scsimon