Sulla Programmazione

Quattro chiacchere sulla programmazione e sulle bit-tecnologie con Fabrizio Cipriani

category: Sql

Cancellazione dei record duplicati in SQL Server con le CTE

Riporto un utilissimo metodo di Pinal Dave per la cancellazione dei record duplicati in Sql Server con le CTE (Common Table Expressions). Le CTE sono state introdotte a partire da Microsoft SQL Server 2005.

Questo è l'articolo orginale:

http://blog.sqlauthority.com/2009/06/23/sql-server-2005-2008-delete-duplicate-rows/

Riassumo brevemente. Assumendo di avere una tabella:

CREATE TABLE DuplicateRcordTable (Col1 INT, Col2 INT)

contenente record con i valori Col1 e Col2 duplicati, è possibile eliminare i duplicati usando la query seguente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
WITH CTE (COl1,Col2, DuplicateCount)
AS
(
    SELECT COl1,Col2,
    ROW_NUMBER ...

Conversione di date in formato EPOCH in MS SQL 2005

Per convertire da una data in formato Epoch in un formato DateTime di SQL server 2005:

DATEADD(s, nomecolonna, '19700101')

Se il formato che avete utilizzato in nomecolonna è Epoch * 1000, ovvero il numero di millisecondi a partire dal 01/01/1970, bisogna dividere la colonna per 1000, il parametro "ms" non funziona:

DATEADD(s, nomecolonna/1000, '19700101')

L'inverso si ottiene in questo modo:

DATEDIFF(s, '1970-01-01 00:00:00', nomecolonna)

SQL: inserimento di record multipli con una singola query

Ecco cosa ho trovato cercando icome inserire più record in una tabella con una singola query SQL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
USE YourDB 
GO 
INSERT INTO MyTable (FirstCol, SecondCol) 
  SELECT 'First' ,1 
  UNION ALL 
  SELECT 'Second' ,2 
  UNION ALL 
  SELECT 'Third' ,3 
  UNION ALL 
  SELECT 'Fourth' ,4 
  UNION ALL 
  SELECT 'Fifth' ,5 
GO

La dritta la trovate nel post di Pinal Dave:

SQL SERVER – Insert Multiple Records Using One Insert Statement – Use of UNION ALL

Dai test eseguiti dai lettori del blog di Pinal Dave, sembra che questo metodo arrivi ad ...

SQL: Se esiste, aggiorna, altrimenti, inserisci

Cercando il modo migliore di gestire con SQL una situazione in cui un dato deve essere aggiornato se esiste, o inserito se non esiste, mi sono imbattuto in questo buon post di Jeremiah Clark:

SQL: If Exists Update Else Insert

Jeremia afferma che il metodo classico:

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')  
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'  
ELSE  
    INSERT INTO Table1 VALUES (...)

non è il più efficente, in quando esegue sempre due table/index scan, uno per la SELECT ed una per l'UPDATE.

Il metodo più efficiente sembra essere il seguente:

UPDATE Table1 SET (...) WHERE Column1 ...

Pulizia delle query SQL in visual studio 2008 con le regular expressions

Vi siete mai messi a pulire le query SQL incorporate all'interno del codice c# per provarle nel query analyzer? Prendete ad esempio questa query:

1
2
3
4
5
6
SqlCommand cmd = new SqlCommand( 
  " SELECT products.prodid, products.prodname, " +
  " categories.catid, categories.catname " +
  " FROM Products " +
  " INNER JOIN Categories ON Products.catid = Categories.catid " +
  " WHERE categoryd = @catid ", cn);

Mi capita spesso di trovarmi di fronte ...