2017-08-09 190 views
0

我想写一个存储过程返回存款记录一个特定的人,存款的那个人,并且存款的那个人的行数目。参数@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 '­'.

任何见解?

谢谢。

+1

检查什么传递给帕拉姆@personID? –

+1

@FullMoonFisher这不应该造成编译错误,只是执行。 – scsimon

回答

1

我删除了这条线SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber和手动重新输入那么它的工作。

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

+0

谢谢。你是如何认定这条线是问题的? – ti034

+1

因为这个错误的附近‘“附近有语法错误'。由非打印字符,如无后打印出来几乎总是被调用’。 –

1

只是一个侧面说明...你#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'.

这意味着选择失败,从而表明该表实际上下降了。

-1
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 
+1

您删除从PROC名称的模式,并且应该解决它? – scsimon

1

我已经删除了下面一行中的额外字符并重新执行此过程。线是 SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber