Posts Tagged SQL Server

Generare una stringa randomica in TSQL

Proprio oggi avevo la necessità di generare una chiave alfanumerica casuale (o stringa randomica che di si voglia) all’interno di una procedura SQL Server. Senza investigare troppo sul motivo di questa necessità :) ecco qua la soluzione.

Una procedura che dato un set di caratteri e una lunghezza N, ritorna in output una strina di N caratteri presi dal set specificato, in modo casuale.

CREATE PROC genera_string_random (@p_len INT, @p_random_string VARCHAR(100) OUTPUT)
AS

BEGIN
DECLARE @v_string VARCHAR(100);
DECLARE @v_type TINYINT;
DECLARE @v_source VARCHAR(100)
DECLARE @v_lenght_source AS TINYINT

SET @v_source = ‘0123456789ABCDEFGHILMNOPQRSTUVZabcdefghilmnopqrstuvz’ – set caratteri
SET @v_lenghtSource = LEN(@v_source) - 1

— scelta del nuovo carattere da aggiungere alla stringa finale
WHILE ( @p_len > 0 )
BEGIN
SET @v_password = @v_password + SUBSTRING(@v_source, CONVERT(INT, ROUND(1 + (RAND() * (@v_lenghtSource)), 0)), 1);
SET @p_len = @len - 1;
END

SET @p_random_string = @v_password;
END
GO

Per utilizzare la procedura:

DECLARE @v_random_string AS VARCHAR(100)
EXEC
genera_string_random 15, @v_random_string OUTPUT
SELECT @v_random_string

Niente di piu facile vero? Chiaramente potete cambiare il set di caratteri in base alle vostre esigenze, ma ricordate che la stringa generata non è univoca, quindi non utilizzatela come chiave primaria di una tabella…

, ,

No Comments

Insert in tabella con campi IDENTITY

Non so se vi è mai capitato di dover inserire un record su una tabella specificando un campo definito identity.
Vista la natura di un identity (o auto increment), che gestisce la generazione del valore del campo in modo sequenziale, non è possibile di default possibile specificare tale valore.
Esempio


–Creo la tabella
CREATE TABLE [TAB1]
(
[ID_TAB1] INT IDENTITY (1,1) NOT NULL, –Campo Idenity che parte da 1 e si incrementa di 1 ad ogni insert
[NAME] VARCHAR(50) NOT NULL
);


–La seguente insert andrà in errore
INSERT INTO [TAB1] ([ID_TAB1], [NAME]) VALUES (123,’Pippo’);
Messaggio 544, livello 16, stato 1, riga 1
Cannot insert explicit value for identity column in table ‘TAB1′ when IDENTITY_INSERT is set to OFF.

Per effettuare l’inserimento, SQL Server 2005 mette disposizione il seguente una variabile di sistema, IDENTITY_INSERT, da utilizzare come segue.


SET IDENTITY_INSERT [TAB1] ON – Abilita la possibilità di settare un campo identity
INSERT INTO [TAB1] ([ID_TAB1], [NAME]) VALUES (123,’Pippo’);
SET IDENTITY_INSERT [TAB1] OFF — Disabilita la possibilità di settare un campo identity

Stessa cosa per un UPDATE, con l’unica differenza che l’errore in tal caso sara il seguente:


UPDATE [TAB1] SET [ID_TAB1] = 123 WHERE [ID_TAB1] = 1
Messaggio 8102, livello 16, stato 1, riga 1
Cannot update identity column ‘ID_TAB1′.

, ,

1 Comment