martedì 21 maggio 2013

abilitare inserimento di un campo IDENTITY

Quando si vogliono inserire delle righe in una tabella con un campo IDENTITY si ha il problema che il campo IDENTITY impedisce un inserimento diretto del campo:

INSERT INTO [dbo].[Item_B] ( [ItemId] , [Cod_db] )
SELECT [ItemId] , [Cod_db] FROM [dbo].[Item_A]
Se un campo è una IDENTITY :
[ItemId] [int] IDENTITY(1,1) NOT NULL,
si ottiene un errore :
Messaggio 544, livello 16, stato 1, riga 2
Quando IDENTITY_INSERT è OFF non è possibile inserire un valore esplicito per la colonna Identity nella tabella 'Item_B'.
Questo è ovvio perchè si suppone che un campo IDENTITY non debba essere inserito ma autocalcolato. Il problema nasce quando ad esempio si vogliono ribaltare tutte le righe di una tabella in un'altra simile, come nell'esempio dove abbiamo supposto due tabelle Item_A Item_B uguali.
 
La soluzione è disabilitare l'IDENTITY prima di procedere all'inserimento:
SET IDENTITY_INSERT [Item_B] ON

Questo comando permette di inserire anche in un campo IDENTITY.
 
Dopo l'inserimento è meglio ripristinare l'IDENTITY,cioè impedire futuri inserimenti :
SET IDENTITY_INSERT [Item_B]OFF

lunedì 20 maggio 2013

come scrivere i commenti in sql server

Esistono due modi per scrivere i commenti in sql server :
  • i commenti in linea
  • i commenti a paragrafo
Un commento in linea deve stare tutto su una linea e deve essere preceduto dai caratteri : (--).

Invece un commento a paragrafo deve essere inserito tra due delimitatori : (/*) e (*\) e dentro i delimitatori ci può essere un numero qualunque di linee di commento.

I commenti non influiscono sul codice e quindi possono essere inseriti in qualunque punto :

-- commenti in linea
select *
/*
commenti a paragrafo
ci possono essere quante
linee vogliamo
*/
from tabella

martedì 14 maggio 2013

cercare nome colonna in tutte le tabelle di un database

Per cercare tutti gli oggetti dove è presente  una colonna ( o un campo che dir si voglia ) si può interrogare la tabella sys.columns :
 
select * from
sys.columns where name like '%name_field%'

Si ottiene l'id oggetto dell'oggetto contenente quel campo :








Per collegarlo ad un nome tabella si va sulla tabella sys.sysobjects :
 
select * from sys.sysobjects where id = 21575115


Le query possono essere effettuate insieme . Questa query estrae tutte le tabelle dove è presente un certo campo :
select c.name as "nome colonna" ,s.name as "nome tabella"
from
sys.columns as c join sys.sysobjects as s
ON c.object_id=s.id
where c.name like '%name_field%'