Informazioni sulle tabelle t-sql con sp_help

sp_help_tnVi trovate a dover gestire un ERROR 3726 durante la cancellazione di una foreign key e non sapete dove mettere le mani?

Un comando molto utile per sapere tutto, ma proprio tutto, della struttura di una tabella e’ sp_help, seguito dal nome della tabella di controllare.

Data di creazione della tabella, descrizione dettagliata di ogni colonna, indici e, soprattutto, la lista di tutte le foreign key assegnate, per controllare a colpo d’occhio le altre tabelle coinvolte e rendersi conto di come mai non riesco a cancellare un record e quali chiavi sono responsabili del vincolo di integrita’ bloccante…

Le informazioni visualizzate sono gia’ tutte disponibili in altre schermate sparse in giro per la management console, semplicemente questo comando le riunisce tutte.

Chiamare una scalar-valued function da Visual Basic 6 con Ado 2.x

Mettiamo di avere nel nostro database una scalar-valued function cosi’ definita

CREATE FUNCTION [dbo].[fnFaiCoseConMessaggio]
(
-- Stringa da spezzare a meta’
@MsgDaProcessare varchar(255)
)
RETURNS float
AS
BEGIN
-- Declare the return variable here
DECLARE @Result varchar(255)

-- fa tutta una serie di cose con il messaggio iniziale
-- ….
SET @Result = @MsgDaProcessare
-- ….

-- ritorna il risultato dell’elaborazione
RETURN @Result
END

Di seguito il codice per poter chiamare la scaled function da Visual Basic 6, utilizzando ADO

Continue reading

Da float a stringhe binarie e viceversa con T-SQL

Potrebbe capitare l’esigenza di dover convertire dei float in stringa, ad esempio per memorizzare dei nuovi dati numerici nei campi stringa lasciati liberi in un db legacy, le cui tabelle non possono per nessun motivo essere estese o modificate.

La soluzione piu’ semplice e’ memorizzare i numeri all’interno del campo stringa nella loro rappresentazione numerica. Ad esempio, se devo memorizzare due numeri

123,4567 e 234,5678

e considerando almeno 10 caratteri per numero, la corrispondente stringa sarÃ

”  123,4567  234,5678″

Per la riconversione al valore originario, leggo la stringa a blocchi da 10 caratteri e la trasformo. Semplice, veloce e leggibile anche ad occhio nudo.

Ma questa non sempre non e’ la soluzione praticabile se lo spazio che si ha a disposizione e’ poco e se i valori dei numeri devono essere preservati nell’interezza del loro range di valori.

Prendiamo il caso  che debba memorizzare 30 quantita’ e 30 prezzi, con un dato di tipo float, per un articolo che ha una scala taglie, come una scarpa, un capo di abbigliamento o altro prodotto fashion.

Se usassi la rappresentazione numerica dei valori, e considerando almeno 16 cifre per ogni numero (virgola compresa), avrei bisogno di (30 + 30) * 16 = 960 byte. Memorizzando invece nella stringa la rappresentazione binaria di valori, necessiterei di (30 + 30) * 8 = 480 byte (il float occupa 8 byte). Certo, i dati avrebbero bisogno di una conversione apposita prima di essere trattati e sarebbero illeggibili “ad occhio nudo”, ma risparmierei la meta’ dello spazio!

Tutto dipende dai casi, ma per quei vecchi db dove ci sono magari 500 caratteri a disposizione per le ulteriori personalizzazione utente, questo giochetto ha preservato la mia sanita’ mentale. ;)

Continue reading

Controllare se esiste una tabella in un Database Access

Il compito sembra facile, ma tra la teoria e la pratica purtroppo c’e’ un abisso.

La prima soluzione consiste nell’interrogare una tabella di sistema presente in tutti i database Access, la MSysObjects.

SELECT * from MSysObjects where Type=1  and Name=’NomeTabella’

Dove NomeTabella e’ il nome della tabella da controllare. Se poi si vuole controllare se con lo stesso nome ci sia una vista, tabella collegata o altra fonte utiie per attingere dati, allora occorre allargare un po’ il Type richiesto:

SELECT MSysObjects.* FROM MSysObjects WHERE (Type=1 OR Type=4 OR Type=5 OR Type=6) and Name=’NomeTabella’

Purtroppo il codice funziona molto bene da Access, ma quando si va ad eseguire da un’applicazione .NET viene restituito un errore di permessi di accesso:
ERROR
[42000] [Microsoft][Driver ODBC Microsoft Access] Impossibile leggere
record. Autorizzazione di lettura non disponibile per "MSysObjects".
ERROR
[42000] 
[Microsoft][ODBC Microsoft Access Driver] Record(s) cannot be read; no read permission on ‘MSysObjects’. 

Continue reading

Aprire database SDF dalla SQL Server Management Console Express

I database SDF, per capirci quelli usati da palmari e smatphone grazie a SQL Server 2005 Compact Edition (anche chiamato SQL CE, SQL Anywhere, SQL Server CE, SSCE ecc), possono essere creati e modificati direttamente dentro Visual Studio 2005 (MSDN – Utilizzo di SQL Server 2005 Compact Edition).

Se invece volessimo gestire questi database fuori dall’ambiente di sviluppo, possiamo farlo grazie al Service Pack 2 per il Microsostr SQL Server Management Studio Express.

In pratica, dopo aver copiato il file dal palmare al nostro computer desktop, apriamo la SSMSX e in File – Connect Object Explorer, apparirà anche la relativa voce per connetterci direttamente ad un database SDF.

Continue reading