2013-07-11 98 views
-4

我有一些我不知道如何解決的錯誤。當我執行這個存儲過程時,我有這些錯誤:存儲過程中語法錯誤

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。我在這裏有一個錯誤。我試圖找到這個錯誤,但我不知道。請問,你能幫我嗎? 非常感謝!

+1

太多的問題代碼。 – jbabey

+2

你不能指望我們通過發佈你所有的代碼來解決你的問題。請專門說明問題,並只發布相關的代碼。 – projeqht

+0

SQLServer的質量控制已經降低,或者您沒有發佈真正的錯誤消息。 「sintax」不是「語法」的正確拼寫,而「P'附近」不是正確的語法。 –

回答

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 「,而第二個則不是。第二個可能是錯的。這至少是你的一個問題。

+0

非常感謝Johnny Bones,你太棒了。 – zoit