SQL : NULL, conversii, vederi

Lucrăm cu Microsoft SQL Server 2014 Enterprise (thanks, MSDNAA).

Testarea marcajului NULL.

USE [master];

SELECT CASE WHEN 3 = 3 THEN (2+88) END AS [Raspuns 1];
GO
SELECT CASE 
         WHEN NULL = 3 THEN CAST((2+88) AS NCHAR(100)) 
         ELSE N'Nu avem egalitate!' 
         /*
             Daca niciunul din predicatele de la
             clauzele WHEN nu are valoarea TRUE,
             atunci, in lipsa clauzei ELSE,
             rezultatul lui CASE va fi NULL!
         */
       END AS [Raspuns 2];
GO
SELECT CASE WHEN NULL IS NULL THEN (2+88) END AS [Raspuns 3];
GO

Diverse funcţii referitoare la NULL.

USE [tempdb];

SELECT 3 + NULL AS [rez 1],
/*
    functia NULLIF:
     ---primul dintre argumente nu poate fi NULL;
     ---returneaza NULL la egalitatea celor doua argumente ale sale;
     ---in caz contrar, returneaza primul dintre argumente;
*/
NULLIF(2,2) AS [rez 2],
NULLIF(2,3) AS [rez 3],
NULLIF(2,NULL) AS [rez 4],
/*
    functia COALESCE:
     ---returneaza primul dintre argumentele sale care este neNULL;
     ---nu este permis ca toate argumentele sa fie NULLe;
*/
COALESCE(NULL,3) AS [rez 5],
COALESCE(2,3,4,'trei',NULL) AS [rez 6];
GO

Promovarea datelor (conversii implicite).

USE [tempdb];

/*
    Promovarea datelor:
	 --- vezi "https://msdn.microsoft.com/en-us/library/ms191530.aspx"
*/
DECLARE @litera_mea AS NCHAR, --Unicode
@litera_mea_2 AS CHAR;
SET @litera_mea = '0'; -- operatorul de asignare produce promovarea datei de la '0' la N'0'
SET @litera_mea_2 = '0';

SELECT @litera_mea AS [Litera (Unicode)],
LEN(@litera_mea) AS [Nr. de litere (Unicode)],
DATALENGTH(@litera_mea) AS [Nr. de octeti (Unicode)],
@litera_mea_2 AS [Litera],
LEN(@litera_mea_2) AS [Nr. de litere],
DATALENGTH(@litera_mea_2) AS [Nr. de octeti];
GO

Conversii forţate.

Descărcaţi codulPentru vizualizare, folosiţi scrollbar-ul din josul blocului de cod.
USE [tempdb];

/*
   --- pt. functia "FORMAT", vezi:
   ------ "https://technet.microsoft.com/en-us/library/hh213505%28v=sql.120%29.aspx"
   ------ "https://msdn.microsoft.com/library/dwhawy9k.aspx"
   --- pt. functiile "CAST", "CONVERT", vezi "https://technet.microsoft.com/en-us/library/ms187928%28v=sql.120%29.aspx"
*/
SELECT CAST(12.34567 AS INT) AS [Numar intreg],
CONVERT(real, 12.34567,2) AS [Numar real],
FORMAT(12.34567,'G','ro') AS [Numar (national)];
GO

/*
   --- pt. tipul de date SQL_VARIANT, vezi "https://technet.microsoft.com/en-us/library/ms173829%28v=sql.120%29.aspx"
   --- pt. functia SQL_VARIANT_PROPERTY, vezi "https://technet.microsoft.com/en-us/library/ms178550%28v=sql.120%29.aspx"
   --- a nu se folosi SQL_VARIANT daca ne bazam pe ODBC...
*/
DECLARE @data_mea AS sql_variant,
@data_mea_2 AS sql_variant;
SET @data_mea = CAST(12.345 AS real);
SET @data_mea_2 = CAST(N'Salut!' AS NCHAR(30));

SELECT @data_mea AS [Numarul],
SQL_VARIANT_PROPERTY(@data_mea,'Precision') AS [Precizia],
SQL_VARIANT_PROPERTY(@data_mea,'BaseType') AS [Tipul original],
REPLICATE('+',16) AS [ ],
@data_mea_2 AS [Sirul],
SQL_VARIANT_PROPERTY(@data_mea_2,'MaxLength') AS [Numarul maxim de octeti],
SQL_VARIANT_PROPERTY(@data_mea_2,'BaseType') AS [Tipul original];
GO

Găsirea definiţiei unor obiecte din baza de date.

USE [TSQLFundamentals2008];

--ID-ul unui tabel
SELECT OBJECT_ID( 'HR.Employees' )  AS [ID-ul Tabelului];
GO

--definitia unei vederi
DECLARE @ID_ul AS INT;
SET @ID_ul = OBJECT_ID( 'Sales.CustOrders' );
SELECT @ID_ul AS [ID-ul Vederii];
SELECT OBJECT_DEFINITION( @ID_ul ) AS [Definitia Vederii];
GO