¿Cómo ejecutar una URL desde SQL Server? Transact-SQL

Es posible ejecutar una url desde SQL Server, esto es útil si quieres realizar algunas tareas programadas por medio de SQL Agent, tareas que inicien por una Url de tu pagina o sistema.

A continuación te muestro cómo es posible ejecutar una URL desde Sql Server.


-- declaramos una variable cadena y ponemos la url a invocar
Declare @url varchar(max)='https://hdeleon.net/'
-- declaramos una variable entero, para guardar el id del objeto OLE que crearemos
Declare @Object as Int;
-- Una variable cadena para la respuesta
Declare @ResponseText as Varchar(8000);

-- creamos un objeto OLE
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
-- Ejecutamos la url por medio de post
Exec sp_OAMethod @Object, 'open', NULL, 'post',@url,'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

-- imprimimos resultado
Select @ResponseText

--eliminamos nuestro id de objeto OLE
Exec sp_OADestroy @Object

Con esto ya puedes ejecutar cualquier URL desde Sql Server.

¿Cómo eliminar las sesiones o conexiones sobre una Base de datos en SQL Server?

Cuando deseamos eliminar una base de datos algunas veces Sql Server no nos lo permite ya que la base de datos está siendo utilizada. Esto puede ser por sistemas que no cierran la conexión o procesos que están conectándose las 24 horas del día.

Para eliminar las conexiones, primero debemos saber cuáles son, y para ello puedes ejecutar la siguiente consulta, remplazando el nombre de tu base de datos en la instrucción Where.


SELECT   *
FROM     sys.dm_exec_sessions
WHERE    DB_NAME(database_id) = 'Nombre_De_Tu_BaseDeDatos'

Una vez que hemos obtenido algo parecido a la siguiente lista:

Debemos ejecutar la función Kill seguida del número de la sesión (el primer campo de la imagen) a eliminar:


KILL 97

Y listo, de esa manera se elimina un proceso que nunca fue cerrado.

¿Cómo realizar un Order by o un Group by a un tipo de dato Text en SQL Server?

Como sabemos un tipo de dato Text es un tipo de datos que no se le puede aplicar un ordenamiento en SQL Server. Si intentamos hacerlo recibiremos un mensaje como este:

No se pueden comparar ni ordenar los tipos de datos text, ntext e image, excepto cuando se utiliza el operador IS NULL o LIKE.

Pero hay una forma con la cual podemos lograrlo, y es convertirlo en un tipo de dato ordenable, en este caso en un tipo varchar, como a continuación muestro:


-- Ordenamiento
select * from tabla
order by CAST(campoText AS varchar(max))

-- Agrupamiento
select CAST(campoText AS varchar(max)) from tabla
group by CAST(campoText AS varchar(max))

De esta manera podemos ordenar o agrupar un tipo de dato Text en SQL Server

¿Como recorrer una tabla con la instrucción while en SQL?

Te muestro cómo es posible recorrer una tabla por medio de una instrucción while en sql.

En el caso de mysql u otro motor solo remplazar top por su equivalente, por ejemplo en mysql: limit 0,1.

Tabla people

Código utilizado:


insert into @tabla(id,name) select id,name from people

declare @count int = (select count(*) from @tabla)

while @count > 0
begin

	declare @name varchar(max) = (select top(1) name from @tabla order by id)
	declare @id int = (select top(1) id from @tabla order by id)

	print 'Hola '+@name

	delete @tabla where id=@id

	set @count = (select count(*) from @tabla)

end 

¿Cómo liberar el espacio en el archivo .ldf de una base de datos en SQL SERVER?

El archivo .ldf de toda base de datos en sql server sirve para llevar un log de toda consulta hecha en la base de datos (todos los insert, update, select, etc etc).

Esto es útil para regresar en un punto en el tiempo y ver la base de datos como se encontraba en ese punto en su estructura y en sus datos.

Pero qué pasa cuando nuestra base de datos pesa ya un tamaño exagerado y queremos liberar el espacio de nuestro servidor. Optamos por realizar una liberación de este archivo (obviamente después de hacer los backups correspondientes).

A continuación te muestro como se debería hacer para una base de datos llamada PATODB:


ALTER DATABASE PATODB SET RECOVERY SIMPLE

GO

/* el 5 es 5 MB, se dejara el log con un tamaño de 5MB*/
DBCC SHRINKFILE (PATODB_Log, 5)

GO

ALTER DATABASE PATODB SET RECOVERY FULL

GO

Y así de simple liberamos el espacio de nuestro archivo .ldf.

Catálogos para facturar CFDI 3.3 SAT en Sql Server

ULTIMA ACTUALIZACIÓN DE LOS CATÁLOGOS: 3 DE ENERO 2018

Pongo a disposición los catálogos en Sql Server publicados por SAT necesarios para la facturación 3.3.

Estaré actualizándolos conforme el SAT libere nuevos registros. Solo dar clic en el siguiente enlace:



DESCARGAR CATÁLOGOS SAT

Si deseas descargar los catálogos para mysql entra aquí

Si deseas descargar los catálogos para SQLite entra aquí

Experimentando con indices en SQL Server – En vivo

¿Cual es la diferencia de utilizar o no utilizar indices en nuestras tablas? Experimento con unas consultas para ver el rendimiento de utilizarlos y no utilizarlos:

¿Cómo crear una función en transact-sql que reciba una cadena con los ids para aplicaros con la función In de sql?

Para esto necesitaremos crear la función mítica Split de sql que tiene años en internet y pongo a continuación (desconozco el autor):

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN
    SET @index = CHARINDEX(@delimiter , @text)
    IF (@index = 0) AND (LEN(@text) > 0)
      BEGIN
        INSERT INTO @Strings VALUES (@text)
          BREAK
      END
    IF (@index > 1)
      BEGIN
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
        SET @text = RIGHT(@text, (LEN(@text) - @index))
      END
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END

Una vez con la función Split agregada a nuestra base de datos de la siguiente manera podemos aplicar una cadena que contenga ids y aplicarles alguna modificación a los registros dentro dicha cadena, por ejemplo una procedimiento que modifique un campo(o varios) en común de varios registros recibiendo una cadena con los ids:

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN
    SET @index = CHARINDEX(@delimiter , @text)
    IF (@index = 0) AND (LEN(@text) > 0)
      BEGIN
        INSERT INTO @Strings VALUES (@text)
          BREAK
      END
    IF (@index > 1)
      BEGIN
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
        SET @text = RIGHT(@text, (LEN(@text) - @index))
      END
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END

Y así la mandaríamos llamar:


EXEC sp_algo '1,3,5,7,77,65,666','leviathan'

Esto es útil y rápido cuando se desea modificar masivamente una colección de registros (por ejemplo desde un backend con entity framework) los cuales tendrán el mismo valor en uno de sus campos, solo tomar precauciones con SQL INJECTION (es 2017 y si aún existe)

¿Cómo reiniciar a 0 la clave primaria en sql server cuando es autoincrementable?

Para reiniciar una clave primaria la cual es autoincrementable, o si deseamos poner que nuestro valor continué en un numero en especifico, se realiza de la siguiente manera:


DBCC CHECKIDENT ('esquema.nombretabla', RESEED, 0);

El anterior código pondrá nuestro contador en 0, siendo el siguiente registro a insertarse 1.