¿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)

Catálogos para facturar CFDI 3.3 SAT en mysql

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

Pongo a disposición los catálogos en mysql 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 sql server entra aquí

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

¿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.

¿Cómo ejecutar una consulta SQL directa utilizando entity framework?

Es curioso para mi hacer esta entrada ya que cuando utilizamos un ORM de alguna manera casí nunca es necesario hacer consultas Sql para obtener o modificar datos de la base de datos, pero algunas veces nos es más fácil hacer la consulta ya sea por comodidad o ya sea un caso muy especial. Para no recurrir al famoso SqlCommand y sus derivados Entity Framework nos permite realizar una consulta en crudo de la siguiente manera:


//creamos nuestro objeto context
NuestroEntitie db= new NuestroEntitie();

//ExecuteSQLCommand invoca la consulta capturada
db.Database.ExecuteSqlCommand("update tabla set campo=1 where id>1000 and fecha>getdate()");

Consulta para obtener comentarios de una base de datos en #Mysql – diccionario de datos

Algunas veces es necesario obtener los comentarios ingresados en las columnas en una base de datos (diccionario de datos). Sobre todo cuando llevamos una buena .

Aquí anexo un script que sirve para obtener los comentarios de una base de datos en particular:


select table_name,column_name,data_type,COLUMN_COMMENT from information_schema.columns
where table_schema = 'nombreDeLaBD'
order by table_name,ordinal_position

Ya solo es cuestión de remplazar “nombreDeLaBd” por tú base de datos y listo.

¿Cómo agregar autoincrement a una llave primaria cuando ya está relacionada a otras tablas? #mysql #constraint #foreign

Cuando tenemos una llave primaria la cual está relacionada a otras tablas y deseamos ponerla como autoincrement (ya sea porque se nos pasó en el diseño o por x circunstancia), debemos poner el valor 0 a la variable de mysql FOREIGN_KEY_CHECKS y para ello lo podemos hacer de la siguiente manera:

SET FOREIGN_KEY_CHECKS = 0;

Y para volverla a activar:

SET FOREIGN_KEY_CHECKS = 1;

Y así nos quedaría nuestra instrucción completa, incluyendo la consulta que hace la llave primaria que se autoincremente:


SET FOREIGN_KEY_CHECKS = 0;

ALTER TABLE `nombreTabla`
MODIFY COLUMN `idTabla`  int(11) NOT NULL AUTO_INCREMENT;

SET FOREIGN_KEY_CHECKS = 1;

Ejecutar una cadena como consulta en SQL Server #SQLServer

Para ejecutar una cadena en Transact-SQL como una consulta, existe el procedure de nombre sp_sqlexec, este recibe la cadena la cual ejecuta. Esto nos sirve para consultas dinámicas pero no es recomendable a menos que se tenga bien planteada la seguridad para evitar travesuras de los “hackers”.

Ejemplo:

declare @cadena varchar(max)='select * from tabla'

exec sp_sqlexec @cadena

¿Como conectarse a puerto no estándar en SQL Server Management Studio? #1433

Para conectarse a un puerto distinto al que es por defecto (puerto 1433) en el motor de SQL Server, basta con agregar el puerto en el campo de nombre de servidor (server name) de la siguiente manera:

NombreDelServidor, 12121

El nombre del servidor, ya sea dominio, IP, o nombre de instancia (SERVIDORSQLEXPRESS), seguido de coma y puerto. Por si no queda claro ahí va un ejemplo: si nuestro servidor esta en la ip 211.168.1.100 y el puerto por el cual tenemos que conectarnos es el 12345, sería de la siguiente manera:

211.168.1.100,12345

Y los demas datos (Login, Password) van de la misma manera que si fuera una conexión a el puerto normal.

Group_concat en #SQLServer, concatenar campos de un agrupamiento como en #mysql.

En este artículo explico cómo realizar una concatenación de un campo de una agrupación en SQL Server (algo parecido a lo que se obtiene con la función group_concat de mysql). Esto sirve para obtener en un registro todos los campos distintos de dicha agrupación. Por ejemplo, tenemos la siguiente tabla de nombre EstadoMunicipio:

tabla sql server - estados municipios

Suponiendo que deseamos agrupar los estados y obtener en un campo al lado la concatenación de sus municipios, eso en mysql se hace con una función llamada group_concat, en SQL Server no existiendo dicha función (que nos facilita todo) podemos obtener el mismo resultado utilizando la función Stuff de Sql Server, pero de una manera especial, como planteo en el siguiente query:

SELECT 
     Estado,
     STUFF(
         (SELECT  municipio +', ' 
          FROM EstadoMunicipio
          WHERE estado = a.estado
          FOR XML PATH (''))
          , 1, 0, '')  AS [Municipios Concatenados]
FROM EstadoMunicipio AS a
GROUP BY Estado

Este es el resultado:

resultado query group_concat sql server

De esa manera podemos realizar algo como lo que hace la función group_concat de mysql.

Si desean utilizar este query, basta con que sustituyan el nombre de la tabla EstadoMunicipio por el nombre de la que tengan ustedes, sustituyan también el nombre del campo municipio, el nombre del campo estado (que es el que utilizamos para agrupar) y la unión realizada en el where, por el campo por el cual están agrupando.