All posts by John Harold Belalcazar Lozano

Software Developer Engineer, since 1995. Husband and father of 2 girls. Learning everyday.

Column exists in SQL Server database / Existe columna en Base de Datos SQL Server / 列が存在します


The easy way to find if a column exists in any database is using the function COL_LENGTH(‘database’, ‘column_name’) if this returns NULL is because the column does not exist. / La forma más fácil de saber si existe una columna en cualquier base de datos es usando la función COL_LENGTH(‘basedatos’, ‘nombre_columna’) si retorna NULL es porque la columna no existe. / データベースに列が存在するかどうかを簡単に確認するには、列が存在しないため、これがNULLを返す場合、COL_LENGTH( ‘database’、 ‘column_name’)関数を使用します。

Example:
create database dbtest1
GO
use dbtest1
GO
create table ttest(id int identity primary key, name varchar(40))
GO
create database dbtest2
GO
use dbtest2
GO
create table ttest(id int identity primary key, name varchar(40), lastname varchar(50))
GO


select COL_LENGTH('[dbtest2].dbo.ttest', 'lastname')

returns 50

select COL_LENGTH('[dbtest1].dbo.ttest', 'lastname')

returns NULL

We are still using dbtest2 but We can check from this database other databases, and the result is that this column does not exists in database dbtest1 table ttest. / Continuamos usando dbtest2 pero podemos chequear desde esta base de datos otras bases de datos y el resultado es que la columna no existe en la tabla ttest base de datos dbtest1.

select COL_LENGTH('[dbtest1].dbo.ttest', 'name')

returns 40

The column exists in database dbtest1 table ttest. / la columna si existe en la tabla ttest base de datos dbtest1

The lack in some software engineering glossary of terms and graphical representations.


Software Engineering is one of the most important careers today. Almost every aspect in our life is now surrounded by devices using software. Having said that, why this profession is lack on having their own terms in some of the main aspects.

For example:

manos-arquitecto-dibujante

Software Architecture, why architecture? Do you know what architecture means?

Architecture is the art and technique of designing, designing and constructing buildings, modifying human habitat and studying, aesthetics, good use and function of spaces, whether architectural or urban.  

For sure there must be a better term to define it in software:

It’s the fundamental structures of a software system and the discipline of creating such structures and systems. Each structure comprises software elements, relations among them, and properties of both elements and relations.

What about this one:

evangelist

Software Evangelist? really?

Evangelism is the commitment to or act of publicly preaching (ministry) of the Gospel with the intention of spreading the message and teachings of Jesus Christ.

In software, there must be a better word for:

The person who builds a critical mass of support for a given technology, and then establishes it as a technical standard in a market that is subject to network effects.

This lack in terms applies too in graphical icons widely used.

puzzlepiñones

For example, have you seen a lot of times the rotating sprockets or puzzles to define “integration”?

Or what about the wrench to define “utilities”.

wrench

 

We really need to establish better own terms and icons to really evolve our software engineering profession. Not the cloning way, real professional new words and graphics.

 

*Some terms extracted from wikipedia.

Advertencia: Establezca la propiedad AutoGenerateBindingRedirects en true en el archivo del proyecto. Visual Studio.


Mensaje de error completo:

Se encontraron conflictos entre diferentes versiones del mismo ensamblado dependiente. Establezca la propiedad “AutoGenerateBindingRedirects” en true en el archivo del proyecto. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkId=294190.

Para eliminar esta advertencia:

Ir al menú Proyecto, Propiedades. Aparece la ventana con todas las propiedades, escoger el apartado “Aplicación” y se da clic en el check “Generar redirecciones de enlace automáticamente”

AutogenerateBindingRedirects
Para eliminar la advertencia

Como monitorear ejecución de triggers en SQL SERVER Profiler / monitor trigger execution


Normalmente por defecto el Sql Server profiler no muestra los resultados en las ejecuciones de triggers, por eso debemos activar esta función, ir a “Events Selection”, Click en “Show all events”, luego buscar “Stored Procedures” y allí marcar los eventos: “SP:StmtCompleted” y “SP:StmtStarting”

monitor trigger

Lista de eventos a seleccionar para monitorear triggers

Ahora ya se pueden visualizar los resultados de ejecución de triggers:

trigger monitor result
En este momento en la ventana de resultados se ve la ejecución del trigger

Normally by default Sql Server profiler is not showing triggers execution, we must activate the option, so, go to “Events Selection”, Click “Show all events”, search “Stored Procedures” select events: “SP:StmtCompleted” y “SP:StmtStarting”

After this you can now watch the trigger execution.

Hey Cortana shut down my computer / Hola Cortana apaga mi computador


It’s now possible to shut down your pc by telling Cortana do that for you. You just need to confirm by a “Yes” and it will be turned off. I searched on internet and it seems at least 2 years ago this is working. But I just discovered today. This kind of vocal commands let people feel near to a more AI powered computer. Update 09/07/2019 I tried to use this feature changing the language in my computer to Spanish, but with no luck. In spanish this is not working yet.

Ahora es posible apagar tu pc diciéndole a Cortana que lo haga. Solo necesitas confirmar con un “Sí” y se apagará. He buscado en internet y parece que hace ya 2 años esto está funcionando, pero lo he descubierto hoy. Esta clase de comandos vocales hacen sentir a las personas un poco más cerca de computadores manejados con IA. Actualización 09/07/2019 He cambiado el idioma de mi computador a Españo y en español no funciona esta característica todavía.

shutdown

Hacer Ciclos o iteraciones en SQL Server / How to make cycles or iterate in SQL Server


Iteración-2

Algunas veces necesitamos en un store procedure recorrer un conjunto de resultados, vamos a usar tablas temporales para este ejemplo. / Sometimes we need to iterate over a resultset, let’s use some temporary tables in this example:

create table #tmpartic(codigo varchar(10), nombre varchar(50), price int)
insert into #tmpartic values('001', 'KEYBOARD / TECLADO', 70)
insert into #tmpartic values('002', 'MOUSE / RATON', 90)
insert into #tmpartic values('003', 'PEN / LAPICERO', 45)
insert into #tmpartic values('004', 'DISPLAY / MONITOR', 150)
insert into #tmpartic values('005', 'HARD DISK / DISCO DURO', 200)

create table #tmpcli(client varchar(10), City varchar(30), limit int)
insert into #tmpartic values('5551010', 'Bogota', 100)
insert into #tmpartic values('5156225', 'Bangladesh', 300)
insert into #tmpartic values('6859852', 'Pekin', 500)
insert into #tmpartic values('7851215', 'Tokio', 500)
insert into #tmpartic values('8989822', 'Sidney', 350)

create table #tmpped(client varchar(10), article varchar(10), price int)

Ahora necesitamos crear registros en la tabla tmpcli para cada cliente todos los artículos mientras no se pase de su límite. /

Now we need to create records in tmpcli table for each client every article without being over limit.

Para esto creamos 2 tablas temporales #tmpartic con cada artículo y su precio y #tmpcli con cada cliente y su límite. El ciclo principal es sobre la tabla temporal de clientes entonces obtenemos su límite y mientras tenga límite disponible agregamos un registro en la tabla #tmpped, por cada registro agregado vamos disminuyendo el precio del artículo para que no se vaya a pasar. El ciclo while se controla mediante la columna kctrl que empieza en null y tras cada iteración cambia a 1 así ya no se procesa más. Para los artículos se debe volver a actualizar en null cuando se cambia de cliente para garantizar que se procesan de nuevo todos los artículos para cada cliente. /

For this we create 2 temporary tables #tmpartic with each article and price y #tmpcli for each client and limit. Main cycle runs on clients temporary table, we read his limit and while limit is available we add a new record in #tmpped, for each record added we subtract the price of the article preventing to add more than expected. The cycle is controled with the column kctrl that starts in null and after every iteration it changes to 1 that way is no longer used. For the articles this column must be updated to null when client is changed to warranty all the articles are processed for each client.

DECLARE @nLIMIT int, @nRECNUM int, @cCLI varchar(10);
DECLARE @nRECNP int, @cART varchar(10), @nPRIC int;
SELECT null kctrl, codigo, price, ROW_NUMBER() OVER(ORDER BY codigo) as recnum into #selpro FROM #tmpartic;
SELECT null kctrl, client, limit, ROW_NUMBER() OVER(ORDER BY limit) as recnum into #selcli FROM #tmpcli;
WHILE (SELECT count(*) FROM #selcli WHERE isnull(kctrl, 0) = 0) > 0
BEGIN
  SET @nRECNUM=(SELECT MIN(recnum) FROM #selcli WHERE ISNULL(kctrl, 0) = 0)
  SELECT @nLIMIT=limit, @cCLI=client FROM #selcli WHERE recnum=@nRECNUM
  UPDATE #selpro SET kctrl=null
  WHILE (SELECT count(*) FROM #selpro WHERE isnull(kctrl, 0) = 0) > 0
    BEGIN
      SET @nRECNP=(SELECT MIN(recnum) FROM #selpro WHERE ISNULL(kctrl, 0) = 0)
      SELECT @cART=codigo, @nPRIC=price FROM #selpro WHERE recnum=@nRECNP
      IF @nLIMIT>=@nPRIC
        BEGIN
          INSERT INTO #tmpped(client, article, price) VALUES(@cCLI, @cART,@nPRIC)
          SET @nLIMIT=@nLIMIT-@nPRIC
        END
      ELSE BREAK
      UPDATE #selpro SET kctrl=1 WHERE recnum=@nRECNP
  END
  UPDATE #selcli SET kctrl=1 WHERE recnum=@nRECNUM
END

Ahora vamos a validar / let’s now validate:
SELECT * from #selcli

clientes

SELECT * from #selpro
articles

SELECT * from #tmpped
peds

Verificación de resultados / Verification of results

Client $Limit $Total Peds ok?
5551010 100 70 Yes
5156225 300 205 Yes
8989822 350 205 Yes
6859852 500 355 Yes
7851215 500 355 Yes

Ahora usted podría cambiar los límites en los clientes y reiniciar el proceso para validar contra diferentes valores /

Now you can change the limits in client and restart the process to verify against different values.

Para borrar todas las tablas / to delete all the tables:

DROP TABLE #tmpartic
DROP TABLE #tmpcli
DROP TABLE #tmpped
DROP TABLE #selpro
DROP TABLE #selcli

Preguntas? / Questions?

Seleccionar registros de una tabla y todos sus registros relacionados. / Select records from a table and all related records.


Este es el comportamiento por defecto de un select sobre múltiples tablas relacionadas, nos devuelve un resultado completo incluyendo los registros de la tabla principal más todos los relacionados / This is the default behavior when performing queries against multiple related tables.

create table #tmpartic(codigo varchar(10), nombre varchar(50))
insert into #tmpartic values('001', 'KEYBOARD / TECLADO')
insert into #tmpartic values('002', 'MOUSE / RATON')
insert into #tmpartic values('003', 'PEN / LAPICERO')
insert into #tmpartic values('004', 'DISPLAY / MONITOR')
insert into #tmpartic values('005', 'HARD DISK / DISCO DURO')

create table #tmpbars(article varchar(10), codbar varchar(20))
insert into #tmpbars values('001', '8909001212')
insert into #tmpbars values('001', '8909001213')
insert into #tmpbars values('001', '8909001214')
insert into #tmpbars values('003', '8909051223')
insert into #tmpbars values('004', '8909061245')
insert into #tmpbars values('005', '8909071241')
insert into #tmpbars values('005', '8909071242')

create table #tmpprov(article varchar(10), proveed varchar(10))
insert into #tmpprov values('001', '101010')
insert into #tmpprov values('001', '102010')
insert into #tmpprov values('001', '103010')
insert into #tmpprov values('002', '102010')
insert into #tmpprov values('003', '103010')
insert into #tmpprov values('004', '101010')
insert into #tmpprov values('004', '102010')
insert into #tmpprov values('004', '104020')
insert into #tmpprov values('005', '104030')

Ahora vamos a seleccionar con un left normal / select with a normal “left” query :

select art.codigo, art.nombre, isnull(bar.codbar,'') as codbar, isnull(pro.proveed,'') as proveed
from #tmpartic art
left join #tmpbars bar on art.codigo=bar.article
left join #tmpprov pro on art.codigo=pro.article

Esto nos retorna todos los registros repetidos artículos en barras y en proveed, se puede ver el artículo 001 que se repite 9 veces / this is returning 9 repeated records of the article 001:

todoslosregistros
Record with all related records

Otra forma de conseguir el mismo resultado:

select art.codigo, art.nombre, isnull(bar.codbar,'') as codbar, isnull(pro.proveed,'') as proveed
from #tmpartic art
outer apply (select * from #tmpbars where art.codigo=article ) bar
outer apply (select * from #tmpprov where art.codigo=article ) pro

Y finalmente, esto para motivos solo de verificación de velocidad o solo por diversión, un select que devuelve una combinación completa de todos los registros. /And finally just to check execution performance or just for fun, a query that returns a complete combination of all records:


select art.codigo, art.nombre, bar.codbar, pro.proveed
from #tmpartic art, #tmpbars bar, #tmpprov pro

exponentialrecords
Exponential