我有一些我不知道如何解決的錯誤。當我執行這個存儲過程時,我有這些錯誤:存儲過程中語法錯誤
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.'[email protected]
END
IF SERVERPROPERTY('MachineName')='MELIBEA'
BEGIN
SET @basedato='PANDORA.'[email protected]
END
IF SERVERPROPERTY('MachineName') = 'SRVDES01'
BEGIN
SET @basedato = 'SRVDES03.'[email protected]
END
SET @sql=ISNULL(@sql+' UNION ', '')+N'SELECT
FechaHora=CONVERT(NVARCHAR,O.Fecha,112)+''''+REPLACE(CONVERT(NVARCHAR,O.Fecha,108),'':'',''''),
[email protected],
Recibo=Convert(NVARCHAR,O.Recibo),
O.Ofrece,
O.CodigoISOAOfrece,
[email protected],
CuentaContratoLiquidacion=O.Recibo,
O.Demanda,
[email protected],
[email protected],
Sucursal='''[email protected]+''',
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)),
[email protected],
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 '[email protected]+'.dbo.Operacion O
INNER JOIN '[email protected]+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
INNER JOIN '[email protected]+'.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 [email protected]
AND [email protected]
AND O.Ofrece>@max'
DELETE FROM @filtro Where [email protected]
BEGIN
IF @trimestre=2
BEGIN
SET @trim1=N'SELECT @n=COUNT(O.Ofrece) FROM '[email protected]+'.dbo.Operacion O
INNER JOIN '[email protected]+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
INNER JOIN '[email protected]+'.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 [email protected]
AND [email protected]
AND O.Ofrece>@max'
print @trim1
END
IF @trimestre=3
BEGIN
SET @trim1=N'SELECT @n=COUNT(O.Ofrece) FROM '[email protected]+'.dbo.Operacion O
INNER JOIN '[email protected]+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
INNER JOIN '[email protected]+'.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 [email protected]
AND [email protected]
AND O.Ofrece>@max'
print @trim1
END
IF @trimestre=4
BEGIN
SET @trim1=N'SELECT @n=COUNT(O.Ofrece) FROM '[email protected]+'.dbo.Operacion O
INNER JOIN '[email protected]+'.dbo.Cliente C ON C.IdCliente=O.CodigoCliente
INNER JOIN '[email protected]+'.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 [email protected]
AND [email protected]
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)[email protected])),* from ('[email protected]+')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 = '' '+轉換(nvarchar的,@ anio)+' '' + '' - ''+ convert(nvarchar,(ROW_NUMBER()OVER(by @anio)+ @ n)),* from('+ @ sql +')P' 因爲@n。我已經將它聲明爲INT,然後我想將它轉換爲nvarchar。我在這裏有一個錯誤。我試圖找到這個錯誤,但我不知道。請問,你能幫我嗎? 非常感謝!
太多的問題代碼。 – jbabey
你不能指望我們通過發佈你所有的代碼來解決你的問題。請專門說明問題,並只發布相關的代碼。 – projeqht
SQLServer的質量控制已經降低,或者您沒有發佈真正的錯誤消息。 「sintax」不是「語法」的正確拼寫,而「P'附近」不是正確的語法。 –