SQL:消息 156,级别 15,状态 1:关键字“END”附近的语法不正确

问题描述 投票:0回答:5

好的,我有 2 个问题 1) 我已经用谷歌搜索了那个错误(在标题中),但我似乎无法得到它来帮助我,我的程序:

CREATE PROCEDURE [dbo].[p_Target]
AS
BEGIN
SET NOCOUNT ON

    CREATE TABLE #tmp1 
    (
        AUD_ID BIGINT,
        RowCounter BIGINT,
        DistinctCounter BIGINT,
        NACounter BIGINT,
        Total BIGINT,
        [Status] VARCHAR(MAX)
    )
   INSERT INTO #tmp1 EXEC [p_GetCompleteIncompleteNaOverviewSCORE] 
DECLARE @Total AS INT

    SELECT @Total = COUNT(*)
    FROM (
    SELECT CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,t2.AUD_TargetDate), 101)) < CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,GETDATE()), 101))
            THEN 'Over Due: '
            ELSE 'On Time: ' END AS [Target Status]
            FROM #tmp1 t1 INNER JOIN dbo.Audit t2
            ON t1.AUD_ID = t2.AUD_ID
            WHERE t1.[Status] = 'Open') DER 

    SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))  + ' of ' + CAST(@Total AS NVARCHAR(255))) AS TargetStatus, (SELECT COUNT(*)) * 100 / (SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))) AS [Count]
    FROM (
    SELECT CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,t2.AUD_TargetDate), 101)) < CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,GETDATE()), 101))
            THEN 'Over Due: '
            ELSE 'On Time: ' END AS [Target Status]
            FROM #tmp1 t1 INNER JOIN dbo.Audit t2
            ON t1.AUD_ID = t2.AUD_ID
            WHERE t1.[Status] = 'Open') DER
    GROUP BY [Target Status] 
    END
GO

我已经将 ) 添加到

NVARCHAR(255))) AS [Count]
但仍然出错,

2)我需要得到

AS [Count]
作为百分比,如果有人可以帮忙吗?那是我的尝试代码,也许我在正确的轨道上。?

sql-server tsql
5个回答
5
投票

您在最终的子选择中缺少一个关闭的paren。此外,您还缺少 SET NOCOUNT 中的“S”。更新如下。

CREATE PROCEDURE [dbo].[p_Target]
AS
BEGIN
SET NOCOUNT ON

    CREATE TABLE #tmp1 
    (
        AUD_ID BIGINT,
        RowCounter BIGINT,
        DistinctCounter BIGINT,
        NACounter BIGINT,
        Total BIGINT,
        [Status] VARCHAR(MAX)
    )
   INSERT INTO #tmp1 EXEC [p_GetCompleteIncompleteNaOverviewSCORE] 
DECLARE @Total AS INT

    SELECT @Total = COUNT(*)
    FROM (
    SELECT CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,t2.AUD_TargetDate), 101)) < CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,GETDATE()), 101))
            THEN 'Over Due: '
            ELSE 'On Time: ' END AS [Target Status]
            FROM #tmp1 t1 INNER JOIN dbo.Audit t2
            ON t1.AUD_ID = t2.AUD_ID
            WHERE t1.[Status] = 'Open') DER 

    SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))  + ' of ' + CAST(@Total AS NVARCHAR(255))) AS TargetStatus, (SELECT COUNT(*)) * 100 / (SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))) AS [Count]
    FROM (
    SELECT CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,t2.AUD_TargetDate), 101)) < CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,GETDATE()), 101))
            THEN 'Over Due: '
            ELSE 'On Time: ' END AS [Target Status]
            FROM #tmp1 t1 INNER JOIN dbo.Audit t2
            ON t1.AUD_ID = t2.AUD_ID
            WHERE t1.[Status] = 'Open') DER
    GROUP BY [Target Status] 
    )
    END
GO

0
投票

也许是在最初的开始之后

SET NOCOUNT ON
上缺少的'S'吗?


0
投票

看起来你的

SELECT
语句在你最后一个
FROM
语句上面有一个未闭合的括号。这将使解析器在遇到
END
语句时抛出错误,因为它仍然认为它正在处理
SELECT
.

SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))  + ' of ' + CAST(@Total AS NVARCHAR(255))) AS TargetStatus, (SELECT COUNT(*)) * 100 / (SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))) AS [Count]
       ^

每当您遇到

incorrect Syntax
错误时,最好仔细检查您的代码并检查所有语句是否格式正确且完整。通常谷歌无法帮助你,因为它非常针对你的代码。查找错误的一个好方法是定位错误点(在本例中为
END
)并逆向工作。错误的原因可能远远高于抛出错误的实际点,但它会在错误之上的某个地方。向后阅读可以帮助您发现简单的错误。


0
投票
Create Table TblAccount (UserName nvarchar(20) Primary Key,UserPwd varchar(20) not null)

Declare @i int
Set @i=1

While @i<=10
I have one question 
BEGIN
    Insert INTO TblAccount Values('Seng Vitou'+CAST(@i AS VARCHar(2)),REVERSE('pwd'+CAST(@i as varchar(2))

    SET @i=@i+1

End   

Msg 156, Level 15, State 1, Line 11
Incorrect syntax near the keyword 'SET'.

0
投票
Declare @i int
SET @i='1'

While @i<=10

BEGIN
    Insert INTO TblAccount(UserName,UserPwd) Values('Seng Vitou'+CAST(@i as nvarchar),reverse('pwd'+CAST(@i as varchar(2))))
    SET @i=@i+1

End   
© www.soinside.com 2019 - 2024. All rights reserved.