存储过程中的语法错误

时间:2013-07-11 19:55:12

标签: sql-server-2008 stored-procedures

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

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(由@anio排序)+ @ n)),*来自('+ @ sql +')P'  因为@n。我已经将它声明为INT,因为你可以看到它,然后我想将它转换为nvarchar但是。我在这里弄错了。我试图找到错误,但我不知道。请你帮助我吗? 非常感谢!

1 个答案:

答案 0 :(得分:0)

您有一个代码块,如下所示:

  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”,而在第二个中你不是。第二个可能是错的。这至少是你的一个问题。