Come generare un Guid.Empty in SQL

Venerdì scorso, il mio collega Luca stava litigando con un problema determinato da valori null, DbNull e Guid in una classe che si occupa di  effettuare query su Database.

La classe Guid, è una classe di tipo Value Type, pertanto non è nullabile. Per contro, nelle Stored Procedure, io utilizzo il valore DbNull come indicatore di Default per indicare che un parametro di filtro è vuoto e deve quindi essere ignorato.

Modificare parecchie classi C# per trasformare il Guid in un Nullable Guid diveniva complicato e non facile da gestire e aggiornare, pertanto abbiamo provato a ragionare ed è risultato che se avessimo potuto usare un Guid.Empty nelle nostre stored procedure (o nelle query ad hoc), avremmo risolto il problema senza complicate manovre.

Facendo varie prove siamo stati in grado di produrre la seguente Scalar Function:

CREATE FUNCTION Guid_Empty()
RETURNS UniqueIdentifier
AS
BEGIN
RETURN cast(cast(0 as binary) as uniqueidentifier)
END
GO

Dopo aver generato la funzione qui sopra ed una semplice tabella nel mio famigerato database di test, sono stata in grado di scrivere la query seguente:

SELECT [ID]
      ,[Descrizione]
      ,[Prezzo]
      ,[Quantità]
      ,[Umi]
      ,IsNull(AltGuid, dbo.Guid_EMPTY()) AS Alt
  FROM [paperinik].[dbo].[TbRighe]

Che produce la seguente tabella risultante:

guidquery

Posso inoltre usare la mia funzione per creare la query seguente:

SELECT [ID]
      ,[Descrizione]
      ,[Prezzo]
      ,[Quantità]
      ,[Umi]
      ,IsNull(AltGuid, dbo.Guid_EMPTY()) AS Alt
  FROM [paperinik].[dbo].[TbRighe]
WHERE
IsNull(AltGuid, dbo.Guid_EMPTY()) = dbo.Guid_EMPTY()

Che mi permette di filtrare le righe con Guid.Empty oppure posso usare l’operatore <> per cercare le sole righe con un Guid non vuoto. Usando questo tipo di Query, posso tranquillamente passare come parametro il Guid.Empty di C# come filtro senza la necessità di creare un Guid nullable o implementare complicate espressioni di controllo nelle mie classi.

Technorati Tag: ,,

Print | posted on martedì 10 agosto 2010 23.05

Feedback

No comments posted yet.

Your comment:





 
Please add 8 and 2 and type the answer here:

Copyright © Sabrina C.

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski