我有一些错误,我不知道如何解决。当我执行这个存储过程时,我有这些错误:
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但是。我在这里弄错了。我试图找到错误,但我不知道。请你帮助我吗? 非常感谢!
答案 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”,而在第二个中你不是。第二个可能是错的。这至少是你的一个问题。