1 0 Tag Archives: Tips & Tricks
post icon

How to fix Visual Studio Database Project Schema Compare duplicate menu items

Visual Studio Database Edition 2008 e Visual Studio Team System 2008 presentano un piccolo bug nella visualizzazione dei menu, in particolare per la voce di menu “Data”.
Infatti le voci di menu “Schema Compare“, “Data Compare“, “Refactor“, ecc. risultano duplicate, se non addirittura triplicate (vedi figura):

Visual Studio DB Project Duplicate menu items

Visual Studio DB Project Duplicate menu items

Questa situazione si può verificare quando ci sono più account sulla stessa macchina che utilizzano Visual Studio, poichè il menu viene mememorizzato in un file di cache a livello utente.
Questo file (nascosto) è reperibile al seguente percorso: %AppData%\Roaming\Microsoft\VisualStudio\9.0\1033\devenv.ctm

Per risolvere il problema dei menu duplicati eseguire i seguenti passaggi:

  1. Assicurarsi che sia Visual Studio (devenv.exe) sia chiuso.
  2. Aprire il prompt dei comandi (Windows Vista o superiore, incluso Windows Server 2008 o superiore) con privilegi di Amministratore
  3. Eseguire i seguenti comandi:

    “%ProgramFiles%\Microsoft Visual Studio 9.0\DBPro\DBProRepair.exe” RemoveDBPro2008

    “%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe” /ResetUserData

    Nota: Su ambienti a 64bit utilizzare la variabile d’ambiente %ProgramFiles(86)% al posto di %ProgramFiles%

  4. Riavviare Visual Studio

Questa procedura mi ha risolto anche un altro problema in fase di Schema Compare. In pratica non mi risultava possibile effettuare uno Schema Compare tra un Database Project poichè risultavano disabilitate le voci “Project” sia del Source che del Target (vedi figura seguente):

Database Schema Compare

Database Schema Compare

post icon

Code Syntax Highlight with SyntaxHighlighter Evolved

Se cercate un discreto Syntax Higlighter per i vostri source code snipppet sono lieto di consigliarvi SyntaxHighlighter Evolved.

E’ disponibile anche come plugin per WordPress (ovviamente).

Ecco un esempio di Code Source Syntax Higlighting:


/* commento */

SELECT Field1, Field2
FROM [dbo].[MyTable]
WHERE Field3 = 'Value'

Trovate tutti i dettagli qui.

June 8th, 2010 @ 08:30
post icon

Cannot truncate table ‘dbo.TableName’ because it is being referenced by a FOREIGN KEY constraint.

Impossibile troncare una tabella quando vi è un vincolo di integrità referenziale

Spesso vi sarà capitato di ottenere il seguente messaggio di errore in SQL Server 2005 / 2008

Cannot truncate table ‘dbo.TableName’ because it is being referenced by a FOREIGN KEY constraint.

nel momento in cui avete tentato di eseguire una TRUNCATE TABLE.
Come si evince dal messaggio di errore il problema è dato dal fatto che la tabella sulla quale si sta cercando di effettuare una TRUNCATE contiene vincoli di integrità referenziale con altre tabelle.

L’unica soluzione per poter effettuare la TRUNCATE è:

  1. Effettuare la DROP delle CONSTRAINTS
  2. Effettuare la TRUNCATE
  3. Ricreare le CONSTRAINTS

possibilmente tutto in transazione.

Ecco uno snippet di esempio:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT

BEGIN TRANSACTION
GO

ALTER TABLE dbo.ChildTable
    DROP CONSTRAINT FK_DETTAGLIORESIDUO_RESIDUI
GO

TRUNCATE TABLE dbo.ChildTable
GO

ALTER TABLE dbo.ChildTable ADD CONSTRAINT
    FK_ChildTable_ParentTable FOREIGN KEY
    (
    IdParentOnChild
    ) REFERENCES dbo.ParentTable
    (
    IdParent
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION 

GO

COMMIT
May 25th, 2010 @ 08:50
post icon

T-SQL: Query Performance – Tips & Tricks

T-SQL: Alcuni accorgimenti per migliorare le prestazioni delle interrogazioni al database

Spesso scriviamo query senza badare tanto alle performance, non tanto in termini di query (che è comunque importante), ma in termini di come ragiona il DBMS (DataBase Management System).

Tip 1: E’ possibile sfruttare i Piani di esecuzione (Execution Plan) che il DBMS si crea per ottimizzare le query è necessario specificare sempre il nome completo degli oggetti come schema.NomeOggetto (es: [dbo].[Categories]).

Molto spesso, infatti, si tende ad omettere il nome dello Schema.

Tip 2: Utilizzare la clausola NOLOCK nelle query di SELECT in modo da limitare i lock sulle tabelle. Attenzione, però, che la clausola NOLOCK imposta il livello di isolamento a UncommittedRead, per cui restituisce anche i record per cui non è stata fatta la commit. Capite, dunque, che è possibile sfruttare la clausola al di fuori di ambienti transazionali, limitando i lock alle tabelle.

USE [Northwind]
GO 

SELECT  [CategoryID],
    [CategoryName],
    [Description]
FROM [dbo].[Categories]

WITH(NOLOCK)

Enjoy snippet!

post icon

TSQL query Skip and Take – Utile per visualizzazioni paginate

Oggi vediamo come utilizzare la funzione di sistema ROW_NUMBER() disponibile dalla versione di SQL 2005 in poi per effettuare delle quary che prendono il nome di Skip and Take. Questa metodologia è stata introdotta con LINQ e consente di recuperare solo un certo numero di record, ad esempio utile per la paginazione in una griglia. Supponiamo di avere 1 milione di record in una tabella e vogliamo creare una griglia paginata, questo è il caso migliore di utilizzo di Skip and Take per evitare di selezionare tutti i record già dalla prima pagina. In pratica si imposta il lumero di record che si vuole estrarre (@QUNTI) e a partire da quele elemento (@DA). Di seguito il codesnippet T-SQL:

USE [Northwind]
GO

DECLARE @DA BIGINT, @QUANTI BIGINT

SET @DA = 1
SET @QUANTI = 10       

SELECT *
FROM(
  SELECT [CustomerID]
        ,[CompanyName]
        ,[ContactName]
        ,[ContactTitle]
        ,[Address]
        ,[City]
        ,[Region]
        ,[PostalCode]
        ,[Country]
        ,[Phone]
        ,[Fax]
        ,ROW_NUMBER() OVER (ORDER BY [CustomerID]) AS ROWNUM
   FROM [Customers]
 ) AS SKTK
WHERE SKTK.ROWNUM BETWEEN @DA AND (@DA + @QUANTI - 1)

Quindi, nel caso della griglia paginata con 10 record per pagina si avrà:

  • Pagina 1: @DA = 1, @QUANTI = 10
  • Pagina 2: @DA = 11, @QUANTI = 10
  • Pagina n: @DA = n * @QUANTI – @QUANTI + 1, @QUANTI = 10

Enjoy snippet!

March 31st, 2010 @ 10:29