T-SQL


26
abr 12

Utilizar WebServices en Microsoft SQL utilizando SSIS – Parte I

No Gravatar

Uno de nuestros usuarios de DcodSms me pregunto si es posible mandar mensajes SMS directamente desde la base de datos y bueno nos dimos a la labor de investigar como buenos desarrolladores que somos. Encontramos una solución que desde mi punto de vista no es tan compleja.

El esquema que vamos a utilizar es muy “simple”:

  1. Desarrollar un DTSx.
  2. Configurar el DTSx en Microsoft SQL.
  3. Crear un Job.
  4. Configurar el Job.
  5. Script para la ejecución de Job.

Crear DTSx

1.- Abrir SQL Server Business Intelligence Development Studio.

2.- Conectarse a Integration Server.

4.- Crear un nuevo proyecto de tipo Integration Services Project.

3.- Crear una variable llamada “respuesta” tipo string.

4.- Arrastrar el componente Web Service Task.

5.- Configurar un nuevo HttpConnection.

6.- Configurar el Input.

7.- Configurar el output.

8.- Guardar todo.

9.- Ejecutar para realizar la prueba.

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

15
mar 12

Mis estimados rudos. Un poco de Java, Hibernate y T-SQL

No Gravatar

Bueno, ser rudo no es tan malo como suele decir. En este periodo QBit esta desarrollando un proyecto utilizando Java con Hibernate, Faces y Microsoft SQL; y necesitabamos tener un entidad cuya información se extraiga de un Procedimiento Almacenado o SP (por sus siglas en ingles Stored Procedure). Vayamos al grano mis estimados entusiastas de la programación:

Supongamos que tenemos la siguiente estructura:

public class MiTablaSP
{
private int id;
private String nombreTablaSP;
 
public int getId()
{
return id;
}
 
public void setId(int id)
{
this.id = id;
}
 
public String getNombreTablaSP()
{
return nombreTablaSP;
}
 
public void setId(String nombreTablaSP)
{
this.nombreTablaSP = nombreTablaSP;
}
}

Ahora veamos el mapeo que son los archivos con extensión hbm:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="MiTablaSP" table="MiTablaSP">
    <id column="id" name="id">
      <generator class="native"/>
    </id>
    <property column="nombreTablaSP" name="nombreTablaSP"/>
  </class>
</hibernate-mapping>
</xml>

Yo sé que para los expertos de la materia me podrían decir que puedo mapear el resultado del SP con los campos de mi objeto de la siguiente manera:

<sql-query callable="true" name="SP_MiTablaSP">
    <return alias="SP_MiTablaSP" class="MiTablaSP">
      <return-property column="id" name="id"/>
      <return-property column="nombreTablaSP" name="nombreTablaSP"/>
    </return>
 
    { call SP_MiTablaSP }
</sql-query>
</xml>

Pero tendría que invocarlo por SP en ves de que nativamente lo llene Hibernate. Continuemos, hay que crear el SP:

CREATE PROCEDURE SP_MiTablaSP
AS
SELECT 1 AS ID
'PRUEBA' AS nombreTablaSP

El penúltimo paso es crear un link:

EXEC sp_addlinkedserver
@server = 'local',
@srvproduct = '',
@provider='SQLNCLI',
@datasrc = @@SERVERNAME

Por útlmo solo hay que crear una vista:

CREATE VIEW MiTablaSP
AS
SELECT * FROM openquery(LOCAL, 'miBaseDatos.dbo.MiTablaSP')

Pues espero que les sea de mucha utilidad y recuerden “El conocimiento mutuo enriquece a todos” :D

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

23
feb 12

Los rudos, rudos, rudos – Algunos otros Tips T-SQL

No Gravatar

Como se podrán dar cuenta seguimos siendo rudos. En lo personal creo que es bueno estar rolando el papel de rudo y técnico (tal vez sea tema de un nuevo post). Se me había olvidado comentarles que hemos estado desarrollando un sitio Web utilizando JBoss, Java (Spring, Hibernate y Faces) y Microsoft SQL (Stored Procedures, Funciones, Vistas, Sinonimos y Antonimos – este último es una broma). Bueno, una de las razones que utilizamos SP (Stored Procedures) es porque el cliente quiere controlar parte de la funcionalidad de la aplicación es esta herramienta.

Ahora bien, tal vez vayan a requerir borrar una o varias tablas pero tienen idea de que llaves foraneas tienen ligada a la tabla y peor aún, tienen una versión de SQL Management Studio anterior a la Base de Datos que tiene el cliente. Este query les puede ser de mucha ayuda:

DECLARE
  @descTabla VARCHAR(255)
BEGIN
  SET @descTabla = 'OT%'
 
  SELECT
    'ALTER TABLE ' + OBJECT_NAME(fok.parent_object_id) +
    ' DROP CONSTRAINT ' + fok.name
    FROM         sysobjects obj
      INNER JOIN sys.foreign_keys fok ON fok.referenced_object_id = obj.id
    WHERE xtype='U'
     AND obj.name LIKE @descTabla
END

Recuerden solo cambiar el valor de la variable @descTabla

Otra funcionalidad que les puede ser de mucha ayuda es crear una tabla temporal (funcionalidad mejorada a partir de la versión 2000 ya que no tienes que borrar la tabla al finalizar el procedimiento):

DECLARE @tmpTabla TABLE( id INT IDENTITY(1,1), nombre VARCHAR(50))

Y bueno, ahora podrán utilizarla como como cualquier otra tabla. En el siguiente ejemplo, la estoy llenando con un SP:

  INSERT INTO @tmpTabla EXEC sp_llenaTabla
  SELECT * FROM @tmpTabla

Esperando les sean de gran utilidad esta información y bueno, los invito a que compartan algunos de sus Tips en este blog.

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

16
feb 12

De técnico a rudo – Script para cambiar registros a cadena

No Gravatar

Buenas tardes mis estimados seguidores :D Bueno hemos estado bastante ocupados por acá (El Qbil Felino) y nos hemos dedicado a programar un buen rato, es por esto que les comparto un script que me parece muy útil ya que convierte los resultados de una consulta  a una cadena. ¡Manos a lo obra!

Primero imaginemos que tenemos la siguiente tabla:

CREATE TABLE [dbo].Cliente(
  id [BIGINT] IDENTITY(1,1) NOT NULL,
  nombre [VARCHAR](50) NULL,
  CONSTRAINT [PK_Cliente] PRIMARY KEY CLUSTERED
  (
  [id] ASC
  )
) ON [PRIMARY]

Ahora con los siguientes valores:

INSERT INTO Cliente VALUES('Patito S.A. de C.V.')
INSERT INTO Cliente VALUES('Pollito S.A. de C.V.')
INSERT INTO Cliente VALUES('Vaca S.A. de C.V.')
INSERT INTO Cliente VALUES('Toro S.A. de C.V.')
INSERT INTO Cliente VALUES('Gallo S.A. de C.V.')
INSERT INTO Cliente VALUES('Camaleon S.A. de C.V.')

 

Por último, queremos obtener los nombres de los clientes separados por el caracter punto y coma (;). Para esto utilizamos el siguiente script:

DECLARE @SQL NVARCHAR(1000)
DECLARE @clientes NVARCHAR(1000)
BEGIN
  SET @SQL = N'SET @clientesOUT = ''''
  SELECT @clientesOUT = @clientesOUT + ''; '' + nombre
    FROM Cliente'
 
  EXEC sp_executesql @SQL,
    N'@clientesOUT NVARCHAR(2000) OUTPUT',
    @clientesOUT = @clientes OUTPUT
 
  SET @clientes = RIGHT(@clientes, LEN(@clientes)-2)
  SELECT @clientes
END

 

Ahora queda de ustedes si quieren meter la funcionalidad a una Función o hacer buen uso de ella.

 

 

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

Qbit Mexhico Blog is using WP-Gravatar