Este artículo pertenece a la serie “Novedades de Integration Services en SQL 2012”, en la que damos un repaso a las principales novedades que nos trae Integration Services en la nueva versión, explorando la entrega CTP3.
El lenguaje de expresiones de Integration Services podemos utilizarlo en columnas derivadas, expresiones en propiedades de componentes, tareas, administradores de conexión, variables, en la nueva Expression Task, etc… Tiene su propia sintaxis, operadores, conjuntos de funciones, etc.. (se observan similitudes con las expresiones de C++). En la versión de SQL 2012 se han agregado tres nuevas funciones que se engloban en el conjunto de funciones para el tratamiento de cadenas: Left, Token y TokenCount.
LEFT(<expression>, len): Obtiene de la cadena pasada como primer parámetro un subsegmento con la longitud del número de caracteres expresados como segundo parámetro, partiendo de la parte izquierda de la cadena.
Left(“Podemos recortar por la izquierda”,7) => “Podemos”
A modo de recordatorio, mencionar que en versiones anteriores se puede conseguir el mismo efecto de varias formas:
Substring(<expression>,start, len): Esta función recoge un sub segmento de la cadena pasada como primer parámetro, pudiendo indicar en que carácter debe comenzar (parametro start) y que longitud tomar (parámetro len), para conseguir el mismo resultado que en ejemplo con Left():
SubString(“Podemos recortar por la izquierda”,0,7) => “Podemos”Reverse(Right(Reverse(<expression>),len)): Es algo enrevesado, pero se consigue el mismo resultado utilizando esta combinación de funciones Reverse(<expression>) y Right(<expression>,len):
Reverse(Right(Reverse("Podemos recortar por la izquierda"),7)) => “Podemos”Script component: Por supuesto, podemos utilizar todas las funciones para el tratamiento de cadena existentes en C# o VB.NET a través de los componentes Script que nos permiten escribir código y referenciar ensamblados.
TOKEN(<expression>,delimiter, ocurrence): Obtiene el segmento de una cadena que se encuentra entre los delimitadores definidos en el segundo parámetro. El tercer parámetro indica que ocurrencia debe tomar. Funciona de forma similar a un Split, pero en lugar de devolver un array con todas las ocurrencias, devuelve solo la ocurrencia indicada. Por Ejemplo
TOKEN( "c:\rutaFicheros\Carpeta 01\Fichero 01.csv", "\",2) => “rutaFicheros”
El delimitador del Token es carácter “” por lo que se encuentran los siguientes Tokens en el ejemplo:
- c:
- rutaFicheros
- Carpeta 01
- Fichero 01.csv
Este comportamiento es mas complicado de simular en versiones anteriores utilizando el lenguaje de expresiones. Sin embargo, si en un Script Task escribimos lo siguiente:
string Cadena = "c:\rutaFicheros\Carpeta 01\Fichero 01.csv" string[] Tokens = Cadena.Split('\'); System.Windows.Forms.MessageBox.Show( Tokens[1].ToString());
Nos devuelve el mismo resultado que la función Token():
TOKENCOUNT(<expression>,delimiter): Devuelve el numero de tokens, utilizando el delimitador que se pasa como segundo parámetro, que se encuentran en una cadena que se analiza en el primer parámetro. Siguiendo el ejemplo anterior:
TOKENCOUNT( "c:\rutaFicheros\Carpeta 01\Fichero 01.csv", "\") => 4
Para buscar una alternativa tendríamos que acudir a una tarea o componente Script:
string Cadena= "c:\rutaFicheros\Carpeta 01\Fichero 01.csv" string[] Tokens = Cadena.Split('\'); System.Windows.Forms.MessageBox.Show(Tokens.GetLength(0).ToString());
Que nos daría el mismo resultado:
Conclusión
La inclusión de estas sencillas funciones en el lenguaje de expresiones nos ahorrará en algunos casos la inclusión de código a través de tareas y componentes Script.