【问题标题】:Wrong syntax in a stored procedure [closed]存储过程中的错误语法[关闭]
【发布时间】:2013-07-11 19:55:12
【问题描述】:

我有一些我不知道如何解决的错误。当我执行这个存储过程时,我有这些错误:

Mens. 102, Level 15, state 1, Line 13
wrong syntax near of ')'.
Mens. 137, Level 15, state 2, Line 13
Must declare the scalar variable "@n".
Mens. 102, Level 15, State 1, Line 431
wrong syntax near of 'P'.

错在哪里?这是代码:

ALTER PROCEDURE [dbo].[PA_InformeOperacionesUSD_MX]
        @trimestre INT,
        @anio INT
AS
BEGIN


DECLARE @filtro TABLE (IdPais INT,IdCentro INT,BaseDato NVARCHAR(50),ISOALocal CHAR(3), ClaveSucursal NVARCHAR(8))
DECLARE @tipooperacion INT,
        @insrtumentomonetario INT,
        @instrumentomonetarioliquidacion INT,
        @colonia NVARCHAR(4),
        @isoalocal CHAR(3),
        @anio2 INT,
        @isoaofrece CHAR(3),
        @centro INT,
        @sql NVARCHAR(MAX),
        @basedato NVARCHAR(50),
        @clavesucursal NVARCHAR(50),
        @max DECIMAL(24,10),
        @trim1 NVARCHAR(MAX),
        @n INT


INSERT INTO @filtro (IdPais, IdCentro,BaseDato,ISOALocal,ClaveSucursal)
            SELECT DISTINCT CodigoPais, IdCentro, BaseDatoGCH2010,CodigoISOA, ClaveSucursal
            FROM Centro C
            INNER JOIN Pais P ON C.Codigopais=P.Idpais 
            WHERE Productivo=1
            AND BaseDatoGCH2010 IS NOT NULL
            AND CodigoPais=105
WHILE EXISTS (Select * from @filtro)
BEGIN
    SELECT TOP 1 @centro=Idcentro,
                @basedato=BaseDato,
                @isoalocal=ISOALocal,
                @clavesucursal=ClaveSucursal 
    FROM @filtro
    IF SERVERPROPERTY('MachineName')='VENUS' 
    BEGIN
        SET @basedato='MARTE.'+@basedato
    END
    IF SERVERPROPERTY('MachineName')='MELIBEA' 
    BEGIN
        SET @basedato='PANDORA.'+@basedato
    END
    IF SERVERPROPERTY('MachineName') = 'SRVDES01'
    BEGIN
        SET @basedato = 'SRVDES03.'+@basedato   
    END     
    SET @sql=ISNULL(@sql+' UNION ', '')+N'SELECT 
                                             FechaHora=CONVERT(NVARCHAR,O.Fecha,112)+''''+REPLACE(CONVERT(NVARCHAR,O.Fecha,108),'':'',''''),
                                             TipoOperacion=@tipooperacion,
                                             Recibo=Convert(NVARCHAR,O.Recibo),
                                             O.Ofrece,
                                             O.CodigoISOAOfrece,
                                             InstrumentoMonetario=@insrtumentomonetario,
                                             CuentaContratoLiquidacion=O.Recibo,
                                             O.Demanda,
                                             MonedaLiquidacion=@isoalocal,
                                             InstrumentoMonetarioLiquidacion=@instrumentomonetarioliquidacion,
                                             Sucursal='''+@clavesucursal+''',
                                             Nombre= CASE WHEN C.Nombre=''''THEN ''XXXX''
                                                    ELSE UPPER(ISNULL(dbo.F_SinCaracteresNoBCRA(C.Nombre),''XXXX'')) END,
                                             Apellido1= CASE WHEN C.Apellido1 ='''' THEN ''XXXX''
                                                        ELSE UPPER(ISNULL(dbo.F_SinCaracteresNoBCRA(C.Apellido1),''XXXX'')) END,
                                             Apellido2= UPPER(ISNULL(dbo.F_SinCaracteresNoBCRA(C.Apellido2),''XXXX'')),
                                             FechaNacimiento= CONVERT(NVARCHAR,C.FechaNacimiento,112),
                                             RFC= CASE WHEN C.CodigoPaisNacionalidad=''MX'' THEN ''XAXX010101000'' ELSE ''XEXX010101000'' END,
                                             CodigoPaisNacionalidad=CASE WHEN C.CodigoPaisNacionalidad IN (SELECT CodigoPais FROM PaisEquivalenteMX) THEN PQ.CodigoPaisEquivalente ELSE C.CodigoPaisNacionalidad END,
                                             Domicilio=UPPER(dbo.F_CambiaCaracteres(C.Direccion)+'' ''+ISNULL(dbo.F_CambiaCaracteres(C.Numero),'''')+'' ''+ISNULL(dbo.F_CambiaCaracteres(C.Piso),'''')+'' ''+ISNULL(dbo.F_CambiaCaracteres(C.Puerta),'''')+'' ''+dbo.F_CambiaCaracteres(C.Localidad)+'' ''+dbo.F_CambiaCaracteres(C.CodigoPostal)+'' ''+dbo.F_CambiaCaracteres(P.Pais)),
                                             Ciudad=UPPER(dbo.F_CambiaCaracteres(C.Localidad)),
                                             Colonia=@colonia,
                                             Documento=NULL,
                                             Pais=CASE WHEN C.CodigoPaisResidencia=''MX''THEN NULL 
                                                        WHEN C.CodigoPaisResidencia IN (SELECT CodigoPais FROM PaisEquivalenteMX) THEN PE.CodigoPaisEquivalente
                                                        ELSE C.CodigoPaisResidencia END 
                                    FROM '+@basedato+'.dbo.Operacion O
                                        INNER JOIN '+@basedato+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
                                        INNER JOIN '+@basedato+'.dbo.Pais P ON P.IdPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PE ON PE.CodigoPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PQ ON PQ.CodigoPais=C.CodigoPaisNacionalidad         
                                    WHERE ((@trimestre=1 AND O.Fecha BETWEEN ''01/01/''+convert(nvarchar(4),@anio) AND ''01/04/''+convert(nvarchar(4),@anio)) 
                                            OR (@trimestre=2 AND O.Fecha BETWEEN ''01/04/''+convert(nvarchar(4),@anio) AND ''01/07/''+convert(nvarchar(4),@anio))
                                            OR (@trimestre=3 AND O.Fecha BETWEEN ''01/07/''+convert(nvarchar(4),@anio) AND ''01/10/''+convert(nvarchar(4),@anio))
                                            OR (@trimestre=4 AND O.Fecha BETWEEN ''01/10/''+convert(nvarchar(4),@anio) AND ''01/01/''+convert(nvarchar(4),@anio2)))
                                        AND O.CodigoISOADemanda=@isoalocal
                                        AND O.CodigoISOAOfrece=@isoaofrece
                                        AND O.Ofrece>@max'

    DELETE FROM @filtro Where IdCentro=@centro


        BEGIN

 IF @trimestre=2 
  BEGIN
    SET @trim1=N'SELECT @n=COUNT(O.Ofrece) FROM '+@basedato+'.dbo.Operacion O
                                        INNER JOIN '+@basedato+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
                                        INNER JOIN '+@basedato+'.dbo.Pais P ON P.IdPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PE ON PE.CodigoPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PQ ON PQ.CodigoPais=C.CodigoPaisNacionalidad         
                                    WHERE ((O.Fecha BETWEEN ''01/01/''+convert(nvarchar(4),@anio) AND ''01/04/''+convert(nvarchar(4),@anio))) 
                                        AND O.CodigoISOADemanda=@isoalocal
                                        AND O.CodigoISOAOfrece=@isoaofrece
                                        AND O.Ofrece>@max'
                                        print @trim1
  END
  IF @trimestre=3
  BEGIN
    SET @trim1=N'SELECT @n=COUNT(O.Ofrece) FROM '+@basedato+'.dbo.Operacion O
                                        INNER JOIN '+@basedato+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
                                        INNER JOIN '+@basedato+'.dbo.Pais P ON P.IdPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PE ON PE.CodigoPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PQ ON PQ.CodigoPais=C.CodigoPaisNacionalidad         
                                    WHERE ((O.Fecha BETWEEN ''01/01/''+convert(nvarchar(4),@anio) AND ''01/04/''+convert(nvarchar(4),@anio)) 
                                            OR (O.Fecha BETWEEN ''01/04/''+convert(nvarchar(4),@anio) AND ''01/07/''+convert(nvarchar(4),@anio)))
                                            OR O.CodigoISOADemanda=@isoalocal
                                        AND O.CodigoISOAOfrece=@isoaofrece
                                        AND O.Ofrece>@max'
                                        print @trim1
  END
  IF @trimestre=4
  BEGIN
    SET @trim1=N'SELECT @n=COUNT(O.Ofrece) FROM '+@basedato+'.dbo.Operacion O
                                        INNER JOIN '+@basedato+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
                                        INNER JOIN '+@basedato+'.dbo.Pais P ON P.IdPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PE ON PE.CodigoPais=C.CodigoPaisResidencia
                                        LEFT JOIN PaisEquivalenteMX PQ ON PQ.CodigoPais=C.CodigoPaisNacionalidad         
                                    WHERE ((O.Fecha BETWEEN ''01/01/''+convert(nvarchar(4),@anio) AND ''01/04/''+convert(nvarchar(4),@anio)) 
                                            OR (O.Fecha BETWEEN ''01/04/''+convert(nvarchar(4),@anio) AND ''01/07/''+convert(nvarchar(4),@anio))
                                            OR(O.Fecha BETWEEN ''01/07/''+convert(nvarchar(4),@anio) AND ''01/10/''+convert(nvarchar(4),@anio)))
                                            OR O.CodigoISOADemanda=@isoalocal
                                        AND O.CodigoISOAOfrece=@isoaofrece
                                        AND O.Ofrece>@max'
  END


  EXEC sp_executesql @trim1,N'@anio INT,                                
                            @isoalocal CHAR(3),
                            @anio2 INT,
                            @isoaofrece CHAR(3),
                            @max DECIMAL(24,10),
                            @n INT OUT',
                            @anio,                              
                            @isoalocal,
                            @anio2,
                            @isoaofrece,
                            @max,
                            @n OUT


END


END


SET @sql=N' SELECT FolioConsecutivo='''+convert(nvarchar,@anio)+'''+''-''+convert(nvarchar,(ROW_NUMBER() OVER(Order by @anio)+@n)),* from ('+@sql+')P '


print @sql
EXEC sp_executesql @sql,N'@anio INT,
                            @tipooperacion INT,
                            @insrtumentomonetario INT,
                            @instrumentomonetarioliquidacion INT,
                            @colonia NVARCHAR(4),
                            @isoalocal CHAR(3),
                            @anio2 INT,
                            @trimestre INT,
                            @isoaofrece CHAR(3),
                            @centro INT,
                            @clavesucursal NVARCHAR(50),
                            @max DECIMAL(24,10),
                            @n',                                
                            @anio,
                            @tipooperacion,
                            @insrtumentomonetario,
                            @instrumentomonetarioliquidacion,
                            @colonia,
                            @isoalocal,
                            @anio2,
                            @trimestre,
                            @isoaofrece,
                            @centro,
                            @clavesucursal,
                            @max,
                            @n
END

我遇到问题的行之一是 SET @sql=N' SELECT FolioConsecutivo='''+convert(nvarchar,@anio)+'''+''-''+convert(nvarchar,(ROW_NUMBER () OVER(Order by @anio)+@n)),* from ('+@sql+')P ' 因为 @n 。如您所见,我已将其声明为 INT ,然后我想将其转换为 nvarchar 但是。我这里有一个错误。我试图找出错误,但我不知道。拜托,你能帮我吗? 非常感谢!

【问题讨论】:

  • 一个问题的代码太多了。
  • 你不能指望我们仅仅通过发布你所有的代码来解决你的问题。请具体描述问题并仅发布相关代码。
  • SQLServer 的质量控制已经严重下降,或者您没有发布真正的错误消息。 “sintax”不是“syntax”的正确拼写,“near of 'P'”不是正确的语法。

标签: sql-server-2008 stored-procedures


【解决方案1】:

你有一段代码如下所示:

  EXEC sp_executesql @trim1,N'@anio INT,                                
                            @isoalocal CHAR(3),
                            @anio2 INT,
                            @isoaofrece CHAR(3),
                            @max DECIMAL(24,10),
                            @n INT OUT',
                            @anio,                              
                            @isoalocal,
                            @anio2,
                            @isoaofrece,
                            @max,
                            @n OUT

还有一个是这样的:

EXEC sp_executesql @sql,N'@anio INT,
                            @tipooperacion INT,
                            @insrtumentomonetario INT,
                            @instrumentomonetarioliquidacion INT,
                            @colonia NVARCHAR(4),
                            @isoalocal CHAR(3),
                            @anio2 INT,
                            @trimestre INT,
                            @isoaofrece CHAR(3),
                            @centro INT,
                            @clavesucursal NVARCHAR(50),
                            @max DECIMAL(24,10),
                            @n',                                
                            @anio,
                            @tipooperacion,
                            @insrtumentomonetario,
                            @instrumentomonetarioliquidacion,
                            @colonia,
                            @isoalocal,
                            @anio2,
                            @trimestre,
                            @isoaofrece,
                            @centro,
                            @clavesucursal,
                            @max,
                            @n

在第一个中,您指定了“@n INT OUT”,而在第二个中,您没有。第二个可能是错误的。这至少是你的问题之一。

【讨论】:

  • 非常感谢 Johnny Bones,你太棒了。
猜你喜欢
  • 2013-06-12
  • 2018-05-12
  • 2011-04-18
  • 2012-04-12
  • 2014-07-12
  • 1970-01-01
相关资源
最近更新 更多