【问题标题】:SQL: Msg 156, Level 15, State 1 :Incorrect syntax near the keyword 'END'SQL:消息 156,级别 15,状态 1:关键字“END”附近的语法不正确
【发布时间】:2014-01-08 13:22:23
【问题描述】:

好的,我有 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] 的百分比,如果有人可以帮忙吗?那是我的尝试代码,也许我在正确的轨道上。?

【问题讨论】:

  • ET NOCOUNT ON 缺少S 是错字吗?

标签: sql-server tsql


【解决方案1】:

您在最后的子选择中缺少一个近括号。此外,您在 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

【讨论】:

    【解决方案2】:

    可能是在初始开始之后SET NOCOUNT ON 上缺少的“S”吗?

    【讨论】:

      【解决方案3】:

      您的最后一个 FROM 语句上方的 SELECT 语句似乎有一个未闭合的括号。这会使解析器在遇到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)并向后工作。错误的原因可能远远高于引发错误的实际点,但它会在错误之上的某个地方。并且向后阅读可以帮助您发现简单的错误。

      【讨论】:

        【解决方案4】:
        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'.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 1970-01-01
          • 2021-09-25
          • 1970-01-01
          • 2013-06-17
          相关资源
          最近更新 更多