Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Pasar Variable como parmametro en un cursor

Estas en el tema de Pasar Variable como parmametro en un cursor en el foro de Bases de Datos General en Foros del Web. Estoy haciendo lo siguiente: Código: Declare @Padre varchar(6) Declare @Cod_Material varchar(18) Declare @Descripcion varchar(40) Declare @Ano int Declare @Mes char(2) Declare @Total float Declare Produccion ...
  #1 (permalink)  
Antiguo 22/10/2004, 12:09
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 8 meses
Puntos: 7
Pasar Variable como parmametro en un cursor

Estoy haciendo lo siguiente:
Código:
Declare @Padre varchar(6)
Declare @Cod_Material varchar(18)
Declare @Descripcion varchar(40)
Declare @Ano int
Declare @Mes char(2)
Declare @Total float

Declare Produccion Insensitive Cursor For
Select Padre, Cod_Material, Descripcion from #Produccion

Open Produccion
Fetch Next From Produccion Into
@Padre, @Cod_Material, @Descripcion

While (@@Fetch_Status <> -1)
Begin
	Select @Mes = Mes, @Ano = Ano, @Total = Total from OpenQuery(SAP,'
	SELECT SUBSTR(Sptag,5,2) as Mes, SUBSTR(Sptag,1,4) as Ano, sum(WEMNG) AS total
	FROM S021 
	WHERE 	MANDT = 400
		And ( Sptag >= ''20040801'' And Sptag <= ''20040831'' )
		And MATNR = ''000000000000002123''
	GROUP BY SUBSTR(Sptag,5,2), SUBSTR(Sptag,1,4)
	')

	Select  @Padre, @Cod_Material, @Descripcion, @Mes, @Ano, @Total

	Fetch Next From Produccion Into
	@Padre, @Cod_Material, @Descripcion
End
Close Produccion
Deallocate Produccion
Lo probé y funciona perfectamente bien, pero lo hice así para percatarme que funciona y le puse el código del material "000000000000002123" de forma fija, ahora quiero ponerlo de forma dinámira en una variable e hice lo siguiente:

Código:
Declare @Padre varchar(6)
Declare @Cod_Material varchar(18)
Declare @Descripcion varchar(40)
Declare @Ano int
Declare @Mes char(2)
Declare @Total float

Declare Produccion Insensitive Cursor For
Select Padre, Cod_Material, Descripcion from #Produccion

Open Produccion
Fetch Next From Produccion Into
@Padre, @Cod_Material, @Descripcion

While (@@Fetch_Status <> -1)
Begin
	Select @Mes = Mes, @Ano = Ano, @Total = Total from OpenQuery(SAP,'
	SELECT SUBSTR(Sptag,5,2) as Mes, SUBSTR(Sptag,1,4) as Ano, sum(WEMNG) AS total
	FROM S021 
	WHERE 	MANDT = 400
		And ( Sptag >= ''20040801'' And Sptag <= ''20040831'' )
		And MATNR = ''' + @Cod_Material +  '''
	GROUP BY SUBSTR(Sptag,5,2), SUBSTR(Sptag,1,4)
	')

	Select  @Padre, @Cod_Material, @Descripcion, @Mes, @Ano, @Total

	Fetch Next From Produccion Into
	@Padre, @Cod_Material, @Descripcion
End
Close Produccion
Deallocate Produccion
Pero me da el siguiente error:
Server: Msg 170, Level 15, State 1, Line 22
Line 22: Incorrect syntax near '+'.

Probé colocandolo asi, con una sola comillita: ' + @Cod_Material + ' y me da el mismo error.

Que estoy haciendo mal?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #2 (permalink)  
Antiguo 22/10/2004, 16:35
 
Fecha de Ingreso: diciembre-2003
Ubicación: WWW
Mensajes: 98
Antigüedad: 20 años, 11 meses
Puntos: 0
Amigo RsOFT para poder pasar datos dinámicos a un openquery, debes introducir toda la instrucción en una variable.
Así:
DECLARE @FechaProceso as char(10)
DECLARE @SQL1 VARCHAR(5000)

Select @SQL1 = 'Select * from openquery (linkserver,''select *
from dp_depositos_plazos
where FECHA_APERTURA_INICIAL<= TO_DATE(''''' + @FechaProceso + ''''',''''MM/DD/YYYY'''') + .99999
order by 1'')'

Exec (@SQL1)

Espero que te funcione....
__________________
"No nos atrevemos a muchas cosas porque son difíciles, pero son difíciles porque no nos atrevemos a hacerlas" :si:

Séneca
  #3 (permalink)  
Antiguo 22/10/2004, 16:41
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 8 meses
Puntos: 7
Eso lo hice, pero las variables @Mes, @Ano y @Total que te muestro debajo no me estaban tomando valores y me daba error, pero lo volveré a probar para especificar exactamente que error me daba:
Cita:
While (@@Fetch_Status <> -1)
Begin
Select @Mes = Mes, @Ano = Ano, @Total = Total from OpenQuery(SAP,'
SELECT SUBSTR...
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #4 (permalink)  
Antiguo 25/10/2004, 14:06
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 8 meses
Puntos: 7
Como dices no me funciona. Me da error en las varibles @Mes, @Ano y @Total

Mira como lo estoy haciendo?
Código:
Declare @Padre varchar(6)
Declare @Cod_Material varchar(18)
Declare @Descripcion varchar(40)
Declare @Ano int
Declare @Mes char(2)
Declare @Total float
Declare @SQL varchar(800)

Declare Produccion Insensitive Cursor For
Select Parent, Name, MAKTX From OpenQuery(SAP,'SELECT Distinct Mcshierb.Parent, Mcshierb.Name, Makt.MAKTX FROM Mcshierb, Makt
WHERE 	Mcshierb.Appl = ''MCS''
        AND Mcshierb.Hname = ''CLAS-MAT01''
	AND Mcshierb.MANDT = 400
	AND (Mcshierb.PARENT = 14 OR Mcshierb.PARENT = 15 OR Mcshierb.PARENT = 16 OR Mcshierb.PARENT = 17) 
	AND Mcshierb.Name = MAKT.MATNR
	AND Mcshierb.MANDT = MAKT.MANDT
	AND MAKT.SPRAS = ''S'' 
')

Open Produccion
Fetch Next From Produccion Into
@Padre, @Cod_Material, @Descripcion

While (@@Fetch_Status <> -1)
Begin
	select @SQL =  'Select @Mes = Mes, @Ano = Ano, @Total = Total from OpenQuery(SAP,''
	SELECT SUBSTR(Sptag,5,2) as Mes, SUBSTR(Sptag,1,4) as Ano, sum(WEMNG) AS total
	FROM S021 
	WHERE 	MANDT = 400
		And ( Sptag >= ''20040801'' And Sptag <= ''20040831'' )
		And MATNR = ''''' + @Cod_Material + '''''
	GROUP BY SUBSTR(Sptag,5,2), SUBSTR(Sptag,1,4)
	'')'

	EXEC (@SQL)
	Select  @Padre, @Cod_Material, @Descripcion, @Mes, @Ano, @Total

	Fetch Next From Produccion Into
	@Padre, @Cod_Material, @Descripcion
End
Close Produccion
Deallocate Produccion
Me tira el siguiente error:
Server: Msg 137, Level 15, State 1, Line 1
Must declare the variable '@Mes'.

Luego de eso, declaré la variable asi:
Código:
	
select @SQL =  '
Declare @Mes char(2)
Select @Mes = Mes from OpenQuery(SAP,''SELECT SUBSTR(Sptag,5,2) as Mes, SUBSTR(Sptag,1,4) as Ano, sum(WEMNG) AS total
FROM S021 
WHERE 	MANDT = 400
	And ( Sptag >= ''20040801'' And Sptag <= ''20040831'' )
	And MATNR = ''''' + @Cod_Material + '''''
GROUP BY SUBSTR(Sptag,5,2), SUBSTR(Sptag,1,4)
'')'
Pero no me trae datos ya que SQL Server considera esa variable independiente de la otra.

La pregunta es: Cómo puedo poner en una variable el resultado del Select que se ha ejecutado de la variable @SQL?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #5 (permalink)  
Antiguo 25/10/2004, 16:11
 
Fecha de Ingreso: diciembre-2003
Ubicación: WWW
Mensajes: 98
Antigüedad: 20 años, 11 meses
Puntos: 0
Pudieras tratar esto:
Declare @Mes varchar(2)
select @SQL = '
Select @Mes=query.Mes from OpenQuery(SAP,''SELECT SUBSTR(Sptag,5,2) as Mes
FROM S021
WHERE MANDT = 400
And ( Sptag >= ''20040801'' And Sptag <= ''20040831'' )
And MATNR = ''''' + @Cod_Material + '''''
GROUP BY SUBSTR(Sptag,5,2), SUBSTR(Sptag,1,4)
'') as query'

Luego me cuentas...
__________________
"No nos atrevemos a muchas cosas porque son difíciles, pero son difíciles porque no nos atrevemos a hacerlas" :si:

Séneca
  #6 (permalink)  
Antiguo 26/10/2004, 06:35
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 8 meses
Puntos: 7
Lo puse con el Alias y me sigue tirando el siguiente error:

Código:
Server: Msg 137, Level 15, State 1, Line 2
Must declare the variable '@Mes'.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #7 (permalink)  
Antiguo 26/10/2004, 07:48
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 8 meses
Puntos: 7
A ver si me explico mejor:

Tu sabes que esto es posible:
Código:
Declare @SQL varchar(300)

Select @SQL = 'Select * from Tabla'
EXEC (@SQL)
lo que no me deja hacer es esto, ya que la variable @Mes me dice que no está declarada:
Código:
Declare @Mes varchar(2)
Declare @SQL varchar(300)

Select @SQL = 'Select @Mes = Campo from Tabla'
EXEC (@SQL)
Select @Mes
Probé exactamente como me dijiste y me sigue diciendo lo mismo:
Código:
Server: Msg 137, Level 15, State 1, Line 2
Must declare the variable '@Mes'.
Qué puedo hacer para resolver mi situación, no quisiera hacer la aplicación en VB, ya que es muy fácil poner a correr un DTS periódicamente en el servidor de SQL y olvidarme de eso
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:06.