variables globales en un DTS

27/06/2007 - 15:39 por Victor | Informe spam
Hola a tod@s.

He declarado este DTS que lo que hace es volcar el las filas de la consulta
de abajo en un fichero.

SELECT RIGHT(dbo.F_Tarjeta_Embarque(grup_codi, bil_id, 12), 12) + case
grup_codi when bil_grupoida then bil_cupon_ida else bil_cupon_vuelta end +
lin_codsap + '972' + '972' + convert(char(10), grup_fechsa, 103) + ' ' +
convert(char(5), grup_horasa, 108) +
cast(tap_tip_id as char(1)) + CASE tir_porcentaje WHEN 0 THEN '00' ELSE
bip_doc_id END + isnull(replicate('0', 12 - len(bip_dni)) + bip_dni,
'000000000000') +
upper(bip_nombre + ' ' + bip_apell1 + ' ' + bip_apell2) AS PARTE4--, @email
AS email
FROM ic_billetes
INNER JOIN ic_grupoviaje ON grup_codi IN (bil_grupoida, bil_grupovuelta)
INNER JOIN ic_linea ON lin_codlin = grup_codlin
INNER JOIN ic_bilper ON bip_bil_id = bil_id
INNER JOIN ic_tarpax ON tap_id = bip_tap_id_i
INNER JOIN ic_tipres ON tir_id = bip_tir_id
WHERE (grup_codi = ?) AND (bil_estado = 'E') AND (bil_tipo <> 'C')

El parámetro global está definido como un Integer y se llama viaje., y por
defecto vale -1. En el diseñador del DTS, si el pongo un valor correcto a
viaje y lo ejecuto funciona bien, pero dejo -1 y desde el analizador de
consultas realizo la siguiente llamada:

EXEC master..XP_CMDSHELL 'DTSRUN /Slocalhost /Nprueba_aarchivo
/A''viaje'':''3''=''32962'' /E'

(como veis le paso el valor 32962 a la variable global) pues no devuelve
nada (supongo que utiliza el -1 como valor y no lee el que yo le paso).

¿Qué falla?

Es el SQLServer 2000.

Y puestos a preguntar: ¿hay forma de especificarle desde el DTSRun el nombre
del fichero (ahroa se llama prueba.txt pero el nombre cada vez cambia) donde
ha de guardar los datos?

Muchas gracias por la ayuda.

Víctor.
 

Leer las respuestas

#1 Alejandro Mesa
27/06/2007 - 16:46 | Informe spam
Hola Victor,

Para pasar valor a las variables globales, el paquete debe haberse guardado
sin proteccion de password y ademas debes tener permiso de dueño del paquete.
Debes encerrar la cadena con doble comilla y no doble apostrofe como estas
haciendo ahora.

/A''viaje'':''3''=''32962''



/A"viaje:32962"

En cuanto a cambiar el nombre del archivo, puedes usar una variable global y
una tarea ActiveX script para cambiar la propiedad "DataSource" de la
conexion al archivo.

Ejemplo:

Crear paquete llamado "test". Crear dos variables globales var1 int y var2
string. Crear conexion a tu SQL Server local, a la db northwind. Crear
conexion al archivo texto de salida y nombrarla "Text File (Destination)".
Usar una tarea de transformacion desde la conexion SQL hacia la conexion
archivo de texto. Usa le sgte query:

select *
from dbo.orders
where orderid = ?

Asocia el parametro con la variable global var1.

Crea una tarea AvticeX script y pon esto en el script:

Function Main()
Dim bError
Dim oConn

Set oConn = DTSGlobalVariables.Parent.Connections("Text File (Destination)")

oConn.DataSource = DTSGlobalVariables("var2").Value

Set oConn = Nothing

Main = DTSTaskExecResult_Success
End Function

Salva el paquete y ejecuta esto desde el propmt:

C:\Temp>dtsrun.exe /S"(local)" /E /N"test" /A"var1:3250"
/A"var2:8=c:\temp\te
st_1.csv"

C:\Temp>dtsrun.exe /S"(local)" /E /N"test" /A"var1:3260"
/A"var2:8=c:\temp\te
st_2.csv"


AMB

"Victor" wrote:

Hola a

He declarado este DTS que lo que hace es volcar el las filas de la consulta
de abajo en un fichero.

SELECT RIGHT(dbo.F_Tarjeta_Embarque(grup_codi, bil_id, 12), 12) + case
grup_codi when bil_grupoida then bil_cupon_ida else bil_cupon_vuelta end +
lin_codsap + '972' + '972' + convert(char(10), grup_fechsa, 103) + ' ' +
convert(char(5), grup_horasa, 108) +
cast(tap_tip_id as char(1)) + CASE tir_porcentaje WHEN 0 THEN '00' ELSE
bip_doc_id END + isnull(replicate('0', 12 - len(bip_dni)) + bip_dni,
'000000000000') +
upper(bip_nombre + ' ' + bip_apell1 + ' ' + bip_apell2) AS PARTE4--, @email
AS email
FROM ic_billetes
INNER JOIN ic_grupoviaje ON grup_codi IN (bil_grupoida, bil_grupovuelta)
INNER JOIN ic_linea ON lin_codlin = grup_codlin
INNER JOIN ic_bilper ON bip_bil_id = bil_id
INNER JOIN ic_tarpax ON tap_id = bip_tap_id_i
INNER JOIN ic_tipres ON tir_id = bip_tir_id
WHERE (grup_codi = ?) AND (bil_estado = 'E') AND (bil_tipo <> 'C')

El parámetro global está definido como un Integer y se llama viaje., y por
defecto vale -1. En el diseñador del DTS, si el pongo un valor correcto a
viaje y lo ejecuto funciona bien, pero dejo -1 y desde el analizador de
consultas realizo la siguiente llamada:

EXEC master..XP_CMDSHELL 'DTSRUN /Slocalhost /Nprueba_aarchivo
/A''viaje'':''3''=''32962'' /E'

(como veis le paso el valor 32962 a la variable global) pues no devuelve
nada (supongo que utiliza el -1 como valor y no lee el que yo le paso).

¿Qué falla?

Es el SQLServer 2000.

Y puestos a preguntar: ¿hay forma de especificarle desde el DTSRun el nombre
del fichero (ahroa se llama prueba.txt pero el nombre cada vez cambia) donde
ha de guardar los datos?

Muchas gracias por la ayuda.

Víctor.



Preguntas similares