================================== LIBRO "SQL SERVER 2016 - La Guida" ESEMPI IN T-SQL ================================== ---------------------------------- CAPITOLO 7 ---------------------------------- -- Questo è un commento /* Questo è un commento piuttosto lungo che non riesco a far stare su un'unica riga e quindi decido di utilizzare questi simboli */ CREATE TABLE TabellaXY (Chiave INT PRIMARY KEY, Descrizione nvarchar(100)) SELECT * FROM [Mia Tabella] -- contiene uno spazio WHERE [SELECT] = 150 -- SELECT è una parola riservata di T-SQL /* VALORI VALIDI: */ 'Blog di Mario De Ghetto' 'http://deghetto.wordpress.com' -- caratteri speciali '19/04/2003' -- data in formato stringa 'L''Uomo' -- ripetizione dell'apice all'interno 0xFF0044AB /* VALORI NON VALIDI: */ 'Errato uso dell'apostrofo' "Virgolette di tipo diverso' 'Mar%' -- vanno bene Mario, Maria, Mariella, Martedì … 'Mar_o' -- vanno bene Mario, Marco, Marmo … -- parentesi quadre '[DML]ario' -- vanno bene Dario, Mario e Lario -- intervallo di caratteri '[A-D]735' -- vanno bene A735, B735, C735 e D735 -- simbolo % '%[_]%' -- va bene qualsiasi sequenza di caratteri -- prima e dopo di un carattere di sottolineatura -- negazione, insieme di caratteri e simbolo % '^[BCD]%' -- va bene qualsiasi sequenza di caratteri che -- non inizi per B, C o D -- negazione, intervallo di caratteri e % '^[B-Y]%' -- è equivalente alla sequenza '[AZ]%' -- dichiaro una variabile di nome "nome" DECLARE @nome varchar(30) -- assegno un valore di tipo stringa alla variabile SET @nome = 'Giuseppe Verdi' -- visualizzo il valore PRINT @nome -- dichiaro una variabile di nome "nome" DECLARE @nome varchar(30) -- assegno un valore di tipo stringa alla variabile SET @nome = 'Giuseppe Verdi' -- dichiaro una variabile di nome "nominativo" DECLARE @nominativo varchar(30) -- leggo il valore della variabile nome -- e l'assegno alla variabile nominativo SET @nominativo = @nome DECLARE @nome varchar(30), @nominativo varchar(30) DECLARE @A int SET @A = 170 DECLARE @B int SET @B = 75 SET @A &= @B PRINT @A -- risultato: 10 DECLARE @A int SET @A = 170 DECLARE @B int SET @B = 75 SET @A |= @B PRINT @A -- risultato: 235 DECLARE @A int SET @A = 170 DECLARE @B int SET @B = 75 SET @A ^= @B PRINT @A -- risultato: 225 DECLARE @A int SET @A = 1 PRINT ~ @A (~A) con A=170 0000 0000 1010 1010 = 170 (base decimale) ------------------- 1111 1111 0101 0101 = -171 (base decimale) DECLARE @str varchar(20), @str2 varchar(20), @str3 varchar(20) SET @str = 'SQL Server' SET @str2 = ' ' SET @str3 = '2016' PRINT @str + @str2 + @str3 DECLARE @str varchar(20), @str2 varchar(20), @str3 varchar(20) SET @str = 'SQL Server' SET @str2 = ' ' SET @str3 = '2016' SET @str += @str2 SET @str += @str3 PRINT @str USE AdventureWorks2008R2 ; GO DECLARE @Giorni AS int SET @Giorni = 2 DECLARE @OrderID AS int SET @OrderID = 43659 IF @Giorni >= ALL ( SELECT DaysToManufacture FROM Sales.SalesOrderDetail JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID WHERE SalesOrderID = @OrderID ) PRINT 'Tutti i prodotti di questo ordine possono essere ' + 'fabbricati nel numero di giorni indicato o meno.' ELSE PRINT 'Alcuni prodotti di questo ordine non possono ' + 'essere fabbricati nel numero di giorni indicato.' ; GO USE AdventureWorks2008R2 ; GO DECLARE @Giorni AS int SET @Giorni = 3 DECLARE @OrderID AS int SET @OrderID = 43659 IF @Giorni < SOME ( SELECT DaysToManufacture FROM Sales.SalesOrderDetail JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID WHERE SalesOrderID = @OrderID ) PRINT 'Alcuni prodotti di questo ordine non possono ' + 'essere fabbricati nel numero di giorni indicato.' ; ELSE PRINT 'Tutti i prodotti di questo ordine possono essere ' + 'fabbricati nel numero di giorni indicato o meno.' GO USE NorthWind; GO SELECT e.Dipendente, e.Vendite FROM dbo.[Analisi vendite] e WHERE e.Vendite BETWEEN 1000 AND 5000 ORDER BY E.Vendite DESC; GO USE NorthWind; GO SELECT e.Dipendente, e.Vendite FROM dbo.[Analisi vendite] e WHERE e.Vendite >= 1000 AND e.Vendite <= 5000 ORDER BY E.Vendite DESC; GO USE NorthWind; GO SELECT a.Cognome, a.Nome, a.Città FROM Clienti AS a WHERE EXISTS (SELECT * FROM dbo.Ordini AS b WHERE a.ID = b.[ID cliente] AND b.[ID dipendente] = '9'); GO USE NorthWind; GO SELECT a.Cognome, a.Nome, a.Città FROM Clienti AS a WHERE a.ID IN (SELECT b.[ID cliente] FROM dbo.Ordini AS b WHERE b.[ID dipendente] = '9'); GO USE NorthWind; GO IF @@FLAG = 0 BEGIN @@FLAG = 1; PRINT N'Attivato il flag.'; END; PRINT N'Fine elaborazione.'; GO DECLARE @vendite money, @media money SET @vendite = 1000 SET @media = 500 IF @vendite < @media PRINT 'Hai venduto troppo poco.' ELSE PRINT 'Complimenti!' PRINT 'Vediamo come si usa GOTO' GOTO saltaqui PRINT 'Riga 2' saltaqui : PRINT 'Ho fatto il salto!' PRINT 'Vediamo come si usa GOTO' IF @flag = 1 GOTO saltaqui ELSE PRINT 'Riga 2' saltaqui : PRINT 'Ho fatto il salto!' CREATE PROCEDURE TrovaProcessi @nome sysname = NULL AS IF @nome IS NULL BEGIN PRINT 'Devi fornire un nome di un utente.' PRINT '(prova con 'sa' o un altro amministratore)' RETURN END ELSE BEGIN SELECT sysobj.name, sysobj.id, sysobj.uid FROM sysobjects sysobj INNER JOIN master..syslogins syslog ON sysobj.uid = syslog.sid WHERE syslog.name = @nome END; USE NorthWind; GO CREATE PROCEDURE VerificaProvStato @param int AS IF (SELECT [Stato/Provincia] FROM Clienti WHERE ID = @param) = 'RM' RETURN 1 ELSE RETURN 2; GO USE msdb; EXECUTE sp_add_job @job_name = 'TrovaProcessi'; BEGIN WAITFOR TIME '15:36'; EXECUTE sp_update_job @job_name = 'TrovaProcessi', @new_name = 'TrovaProcessiAggiornato'; END; GO BEGIN WAITFOR DELAY '00:01'; EXECUTE sp_helpdb; END; GO DECLARE @max int; SET @max = 10; DECLARE @conteggio int; SET @conteggio = 1; WHILE @conteggio <= @max BEGIN PRINT @conteggio SET @conteggio = @conteggio + 1 END; USE NorthWind; GO WHILE (SELECT AVG([Prezzo di listino]) FROM Prodotti) < 300 BEGIN UPDATE Prodotti SET [Prezzo di listino] = [Prezzo di listino] * 2 SELECT MAX([Prezzo di listino]) FROM Prodotti IF (SELECT MAX([Prezzo di listino]) FROM Prodotti) > 500 BREAK ELSE CONTINUE END PRINT 'Troppo da sopportare per il mercato'; USE NorthWind; GO SELECT Cognome, Nome, Provincia = CASE [Stato/Provincia] WHEN 'RM' THEN 'Roma' WHEN 'LT' THEN 'Latina' ELSE 'Altra provincia' END FROM Dipendenti ORDER BY Cognome; GO USE NorthWind; GO SELECT [Codice Prodotto], [Nome prodotto], 'Intervallo di prezzo' = CASE WHEN [Prezzo di listino] = 0 THEN 'Non destinato alla vendita' WHEN [Prezzo di listino] < 50 THEN 'Inferiore a 50 €' WHEN [Prezzo di listino] >= 50 and [Prezzo di listino] < 250 THEN 'Inferiore a 250 €' WHEN [Prezzo di listino] >= 250 and [Prezzo di listino] < 1000 THEN 'Inferiore a 1000 €' ELSE 'Oltre 1000' END FROM Prodotti ORDER BY [Codice prodotto] ; GO SELECT Cognome, Posizione FROM Dipendenti ORDER BY CASE Posizione WHEN 'Venditore' THEN Cognome END CASE WHEN Posizione <> 'Venditore' THEN Cognome END DESC; GO USE AdventureWorks2008R2; GO SELECT Name, Class, Color, ProductNumber, COALESCE(Class, Color, ProductNumber) AS FirstNotNull FROM Production.Product; GO SET NOCOUNT ON; GO USE tempdb; IF OBJECT_ID('dbo.es_coalesce') IS NOT NULL DROP TABLE es_coalesce; GO CREATE TABLE dbo.es_coalesce ( id tinyint identity, tariffa_ora decimal NULL, salario decimal NULL, commissioni decimal NULL, num_vendite tinyint NULL ); GO INSERT dbo.es_coalesce (tariffa_ora, salario, commissioni, num_vendite) VALUES (10.00, NULL, NULL, NULL), (20.00, NULL, NULL, NULL), (30.00, NULL, NULL, NULL), (40.00, NULL, NULL, NULL), (NULL, 10000.00, NULL, NULL), (NULL, 20000.00, NULL, NULL), (NULL, 30000.00, NULL, NULL), (NULL, 40000.00, NULL, NULL), (NULL, NULL, 15000, 3), (NULL, NULL, 25000, 2), (NULL, NULL, 20000, 6), NULL, NULL, 14000, 4); GO SET NOCOUNT OFF; GO SELECT CAST(COALESCE(tariffa_ora * 40 * 52, salario, commissioni * num_vendite) AS money) AS 'Salario totale' FROM dbo.es_coalesce ORDER BY 'Salario totale'; GO USE NorthWind; GO IF OBJECT_ID ('dbo.budget','U') IS NOT NULL DROP TABLE budget; GO SET NOCOUNT ON; CREATE TABLE dbo.budget ( dipartimento tinyint IDENTITY, anno_corrente decimal NULL, anno_precedente decimal NULL ); INSERT budget VALUES(100000, 150000); INSERT budget VALUES(NULL, 300000); INSERT budget VALUES(0, 100000); INSERT budget VALUES(NULL, 150000); INSERT budget VALUES(300000, 250000); GO SET NOCOUNT OFF; SELECT AVG(NULLIF(COALESCE(anno_corrente, anno_precedente), 0.00)) AS 'Budget Medio' FROM budget; GO USE AdventureWorks2008R2; GO SELECT ProductID, MakeFlag, FinishedGoodsFlag, NULLIF(MakeFlag,FinishedGoodsFlag)AS 'Null if Equal' FROM Production.Product WHERE ProductID < 10; GO SELECT ProductID, MakeFlag, FinishedGoodsFlag,'Null if Equal' = CASE WHEN MakeFlag = FinishedGoodsFlag THEN NULL ELSE MakeFlag END FROM Production.Product WHERE ProductID < 10; GO ---------------------------------- CAPITOLO 8 ---------------------------------- USE master; GO CREATE DATABASE Vendite ON ( NAME = Vendite_db, FILENAME = 'C:\Database\vendite_db.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Vendite_log, FILENAME = 'C:\Database\vendite_log.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ; GO USE master; ALTER DATABASE Vendite SET SINGLE_USER; GO EXEC sp_detach_db 'Vendite', 'true'; EXEC sp_attach_db @dbname = N'Vendite', @filename1 = N'C:\Database\vendite_db.mdf', @filename2 = N'C:\Database\vendite_log.ldf'; EXEC sp_detach_db 'NorthWind', 'true'; CREATE DATABASE Northwind_snapshot ON ( NAME = NorthWind, FILENAME = 'C:\Database\NortWind_snapshot' ) AS SNAPSHOT OF NorthWind; ALTER DATABASE AdventureWorks MODIFY NAME = AdventureWorksNew -- creazione del database CREATE DATABASE testdb COLLATE French_CI_AI -- modifica della regola di confronto ALTER DATABASE testDB COLLATE SQL_Latin1_General_CP1_CI_AS ALTER DATABASE AdventureWorks2012 SET QUERY_STORE = ON; ---------------------------------- CAPITOLO 9 ---------------------------------- -- Creazione di una tabella CREATE TABLE Impiegati (Cognome nvarchar(30), Nome nvarchar(30), DataNascita datetime) -- Creazione di una tabella con un campo -- di tipo uniqueidentifier CREATE TABLE Nominativi (guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL, Nominativo varchar(60) CONSTRAINT Guid_PK PRIMARY KEY (guid) ) -- definizione di una colonna calcolata CREATE TABLE MiaTabella ( minimo int, massimo int, media AS (minimo + massimo)/2 ) -- creazione di tabella con colonna con molti valori Null CREATE TABLE ColonnaSparsa (colonna1 int PRIMARY KEY, Colonna2 varchar(100) SPARSE NULL ) -- creazione di colonna di tipo FILESTREAM CREATE TABLE BadgeImpiegati ( IDimpiegato int NOT NULL PRIMARY KEY, Badge varbinary(max) FILESTREAM NULL, guid uniqueidentifier NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID() ) -- ================================================ -- Template generated from Template Explorer using: -- Create Trigger (New Menu).SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- See additional Create Trigger templates for more -- examples of different Trigger statements. -- -- This block of comments will not be included in -- the definition of the function. -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE TRIGGER . ON . AFTER AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here END GO EXEC sp_rename 'NomeTabella', 'Nuovo_NomeTabella' EXEC sp_rename 'NomeTabella.[NomeColonna]', 'NomeTabella.[Nuovo_NomeColonna]' -- aggiungere una colonna ALTER TABLE dbo.documenti ADD nomeFirma VARCHAR(30) NULL -- rimuovere una colonna ALTER TABLE dbo.documenti DROP COLUMN nomeFirma -- modificare il tipo di dato di una colonna ALTER TABLE dbo.documenti ALTER COLUMN importo DECIMAL (5, 2) -- impostare il valore di default per una colonna ALTER TABLE dbo.documenti ADD CONSTRAINT colonna_3 DEFAULT 100 FOR colonna_3 -- eliminazione di un vincolo ALTER TABLE dbo.documenti DROP CONSTRAINT MioVincolo -- rilevamento delle modifiche di una tabella ALTER TABLE Indirizzi ENABLE CHANGE_TRACKING -- rilevamento delle modifiche di una tabella con -- il rilevamento delle colonne aggiornate ALTER TABLE Indirizzi ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON) -- aggiunta di una colonna sparsa ALTER TABLE Tabella1 ADD NumeroFax char(100) SPARSE NULL ; -- creazione di tabella con un vincolo CREATE TABLE Dipendenti (id INT NOT NULL, nome VARCHAR(10) NOT NULL, stipendio MONEY NOT NULL CONSTRAINT stipendioMax CHECK (stipendio < 100000) ); -- inserimenti validi INSERT INTO Dipendenti VALUES (1,'Mario Rossi',45000); INSERT INTO Dipendenti VALUES (2,'Luigi Verdi',63000); -- inserimento non valido perché non -- rispetta il vincolo INSERT INTO Dipendenti VALUES (3,'Carlo Gialli',112000); -- disabilitazione del vincolo e reinserimento -- della stessa riga ALTER TABLE Dipendenti NOCHECK CONSTRAINT stipendioMax; INSERT INTO Dipendenti VALUES (3,'Carlo Gialli',112000); -- riattivazione del vincolo e inserimento di una -- riga che viola il vincolo: questa fallisce di nuovo ALTER TABLE Dipendenti CHECK CONSTRAINT stipendioMax; INSERT INTO Dipendenti VALUES (4,'Bruna Rossi',110000) ; DROP TABLE Clienti -- database corrente DROP TABLE dbo.Clienti -- database corrente DROP TABLE AziendaDB.dbo.Clienti -- dichiarazione completa DROP TABLE Azienda..Clienti -- non è indicato lo schema ---------------------------------- CAPITOLO 10 ---------------------------------- /****** Script for SelectTopNRows command from SSMS ******/ SELECT TOP (1000) [ID] ,[Società] ,[Cognome] ,[Nome] ,[Indirizzo di posta elettronica] ,[Posizione] ,[Telefono (uff)] ,[Telefono domicilio] ,[Tel cellulare] ,[Fax] ,[Indirizzo] ,[Città] ,[Stato/Provincia] ,[CAP] ,[Paese] ,[Pagina Web] ,[Note] ,[Allegati] FROM [NorthWind].[dbo].[Clienti] SELECT [Cognome] ,[Nome] FROM [NorthWind].[dbo].[Clienti] ORDER BY Cognome SELECT * FROM Clienti SELECT * FROM DimEmployee ORDER BY LastName; SELECT t.* FROM DimEmployee AS t ORDER BY LastName; SELECT FirstName, LastName, StartDate AS FirstDay FROM DimEmployee ORDER BY LastName; SELECT FirstName, LastName, StartDate AS FirstDay FROM DimEmployee WHERE EndDate IS NOT NULL AND MaritalStatus = 'M' ORDER BY LastName; SELECT FirstName, LastName, BaseRate, BaseRate * 40 AS GrossPay FROM DimEmployee ORDER BY LastName; SELECT DISTINCT Title FROM DimEmployee ORDER BY Title; SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales FROM FactInternetSales GROUP BY OrderDateKey ORDER BY OrderDateKey; SELECT OrderDateKey, PromotionKey, AVG(SalesAmount) AS AvgSales, SUM(SalesAmount) AS TotalSales FROM FactInternetSales GROUP BY OrderDateKey, PromotionKey ORDER BY OrderDateKey; SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales FROM FactInternetSales WHERE OrderDateKey > '20020801' GROUP BY OrderDateKey ORDER BY OrderDateKey; SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales FROM FactInternetSales GROUP BY OrderDateKey HAVING OrderDateKey > 20140000 ORDER BY OrderDateKey; UPDATE Agenti SET Bonus = 6000, Provvigione = .15, Annotazioni = NULL; UPDATE Merci SET Prezzo = Prezzo * 1.1; UPDATE Merci SET Colore = N'Verde metallizzato' WHERE Nome LIKE N'Premium 100%' AND Color = N'Verde'; CREATE TABLE Tab (Cognome varchar(30), Nome varchar(30)); GO INSERT INTO Tab VALUES ('De Ghetto', 'Mario'), ('Verdi', 'Giuseppe'), ('Gialli', 'Marco'; GO INSERT Vendite SELECT i.IDimpiegato, c.Cognome, v.ImportoVendite FROM Impiegati AS i INNER JOIN Venditori AS v ON i.IDimpiegato = v.IDvenditore INNER JOIN Contatti AS c ON i.IDcontatto = c.IDcontatto WHERE i.IDimpiegato LIKE '1%' ORDER BY i.IDimpiegato, c.Cognome; GO SELECT * INTO NuoviProdotti FROM Prodotti WHERE AnnoProduzione = 2009 DELETE FROM Elenco; DELETE FROM Ordini WHERE Totale = 0; DELETE FROM Venditori WHERE IDVenditore IN (SELECT IDVenditore FROM RiepilogoOrdini WHERE TotaleOrdini = 0); DELETE FROM Venditori FROM Venditori AS V INNER JOIN RiepilogoOrdini AS RO ON V.IDVenditore = RO.IDVenditore WHERE RO.TotaleOrdini = 0; ---------------------------------- CAPITOLO 12 ---------------------------------- -- creazione di un semplice indice denominato IDvenditore -- basato sul campo IDvenditore della tabella Venditore CREATE INDEX IDvenditore ON Venditore (IDvenditore); -- creazione di un indice composto non-cluster CREATE NONCLUSTERED INDEX IDprodotto, dataOrdine ON Scorte (IDprodotto, dataOrdine); -- creazione di un indice non-cluster univoco CREATE UNIQUE INDEX Nome ON Clienti(Nome); -- creazione di un indice "cluster", univoco, -- di nome "Indice1" e basato su un campo -- calcolato di nome "cal" CREATE UNIQUE CLUSTERED INDEX Indice1 ON tab(cal); -- eliminazione di un indice con DROP_EXISTING CREATE NONCLUSTERED INDEX IDprodotto ON Ordini(IDprodotto) WITH (FILLFACTOR = 80, PAD_INDEX = ON, DROP_EXISTING = ON); -- ricostruzione di un indice ALTER INDEX IDimpiegato ON Impiegati REBUILD -- ricostruzione di tutti gli indici della tabella -- Prodotti con l'impostazione di alcune opzioni ALTER INDEX ALL ON Prodotti REBUILD WITH (FILLFACTOR = 75, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON) -- impostazione di alcune opzioni -- senza ricostruzione dell'indice ALTER INDEX NumeroOrdini ON OrdiniTestata SET ( STATISTICS_NORECOMPUTE = ON, IGNORE_DUP_KEY = ON, ALLOW_PAGE_LOCKS = ON) -- disabilitazione di un indice ALTER INDEX IDdipendente ON Dipendenti DISABLE -- eliminazione di un indice DROP INDEX IDfornitore ON Fornitori -- è possibile anche eliminare più di un indice -- con la stessa istruzione DROP INDEX IDfornitore ON OrdiniTestata, IDindirizzo ON FornitoriIndirizzi ---------------------------------- CAPITOLO 13 ---------------------------------- SELECT dbo.Clienti.* FROM dbo.Clienti WHERE (Nome = 'Giuseppe') SELECT ID, Società, Cognome, Nome, [Indirizzo di posta elettronica], Posizione, [Telefono (uff)], [Telefono domicilio], [Tel cellulare], Fax, Indirizzo, Città, [Stato/Provincia], CAP, Paese, [Pagina Web], Note, Allegati FROM dbo.Clienti WHERE (Nome = 'Giuseppe') SELECT TOP (100) PERCENT dbo.Ordini.[Data ordine], dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Codice prodotto], dbo.Prodotti.[Nome prodotto], dbo.[Dettagli sugli ordini].Quantità, dbo.[Dettagli sugli ordini].[Prezzo unitario] FROM dbo.Ordini INNER JOIN dbo.[Dettagli sugli ordini] ON dbo.Ordini.[ID ordine] = dbo.[Dettagli sugli ordini].[ID ordine] INNER JOIN dbo.Prodotti ON dbo.[Dettagli sugli ordini].[ID prodotto] = dbo.Prodotti.ID ORDER BY dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Nome prodotto] -- creazione di una vista da un'istruzione SELECT CREATE VIEW [dbo].[vw_Ordini] AS SELECT TOP (100) PERCENT dbo.Ordini.[Data ordine], dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Codice prodotto], dbo.Prodotti.[Nome prodotto], dbo.[Dettagli sugli ordini].Quantità, dbo.[Dettagli sugli ordini].[Prezzo unitario] FROM dbo.[Dettagli sugli ordini] INNER JOIN dbo.Ordini ON dbo.[Dettagli sugli ordini].[ID ordine] = dbo.Ordini.[ID ordine] INNER JOIN dbo.Prodotti ON dbo.[Dettagli sugli ordini].[ID prodotto] = dbo.Prodotti.ID ORDER BY dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Nome prodotto] -- creazione di una vista da un'istruzione SELECT CREATE VIEW [dbo].[vw_Ordini] AS -- modifica di una vista esistente ALTER VIEW [dbo].[vw_Ordini] AS SELECT TOP (100) PERCENT dbo.Ordini.[Data ordine], dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Codice prodotto], dbo.Prodotti.[Nome prodotto], dbo.[Dettagli sugli ordini].Quantità, dbo.[Dettagli sugli ordini].[Prezzo unitario] FROM dbo.[Dettagli sugli ordini] INNER JOIN dbo.Ordini ON dbo.[Dettagli sugli ordini].[ID ordine] = dbo.Ordini.[ID ordine] INNER JOIN dbo.Prodotti ON dbo.[Dettagli sugli ordini].[ID prodotto] = dbo.Prodotti.ID ORDER BY dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Nome prodotto] DROP VIEW vw_Ordini CREATE UNIQUE CLUSTERED INDEX IDX_vw_Ordini ON dbo.vw_Ordini ([Data ordine], [Nome spedizione], [Codice prodotto]); ALTER VIEW dbo.vw_Ordini WITH SCHEMABINDING AS SELECT dbo.Ordini.[Data ordine], dbo.Ordini.[Nome spedizione], dbo.Prodotti.[Codice prodotto], dbo.Prodotti.[Nome prodotto], dbo.[Dettagli sugli ordini].Quantità, dbo.[Dettagli sugli ordini].[Prezzo unitario] FROM dbo.[Dettagli sugli ordini] INNER JOIN dbo.Ordini ON dbo.[Dettagli sugli ordini].[ID ordine] = dbo.Ordini.[ID ordine] INNER JOIN dbo.Prodotti ON dbo.[Dettagli sugli ordini].[ID prodotto] = dbo.Prodotti.ID CREATE UNIQUE CLUSTERED INDEX IDX_vw_Ordini ON dbo.vw_Ordini ([Data ordine], [Nome spedizione], [Codice prodotto]); SELECT * FROM Regioni SELECT NomeRegione FROM Regioni SELECT CodRegione, NomeRegione FROM Regioni SELECT CodRegione, NomeRegione FROM Regioni SELECT CodRegione, NomeRegione FROM Regioni SELECT NomeRegione FROM Regioni ORDER BY NomeRegione SELECT NomeRegione FROM Regioni ORDER BY NomeRegione DESC SELECT NomeRegione, CodRegione FROM Regioni ORDER BY NomeRegione, CodRegione DESC SELECT CodRegione, NomeRegione FROM Regioni WHERE NomeRegione = 'Veneto' SELECT NomeRegione FROM Regioni WHERE NomeRegione < 'Friuli' ORDER BY NomeRegione SELECT NomeRegione FROM Regioni WHERE NomeRegione > 'Friuli' ORDER BY NomeRegione SELECT NomeRegione FROM Regioni WHERE NomeRegione >= 'Friuli V.G.' ORDER BY NomeRegione SELECT NomeRegione FROM Regioni WHERE NomeRegione >= 'Friuli V.G.' AND NomeRegione <= 'Liguria' ORDER BY NomeRegione SELECT NomeRegione FROM Regioni WHERE NomeRegione <= 'Calabria' OR NomeRegione >= 'Umbria' ORDER BY NomeRegione SELECT TOP(5) NomeRegione FROM Regioni ORDER BY NomeRegione SELECT TOP(5) NomeRegione FROM Regioni ORDER BY NomeRegione DESC SELECT TOP(25) PERCENT NomeRegione FROM Regioni ORDER BY NomeRegione SELECT * FROM Regioni WHERE NomeRegione LIKE 'C%' ORDER BY NomeRegione SELECT * FROM Regioni WHERE NomeRegione LIKE '_A%' ORDER BY NomeRegione SELECT * FROM Regioni WHERE NomeRegione LIKE '%[TZ]%' ORDER BY NomeRegione SELECT * FROM Regioni WHERE NomeRegione LIKE '%[']%' ORDER BY NomeRegione SELECT * FROM Regioni WHERE NomeRegione LIKE '%['']%' ORDER BY NomeRegione SELECT * FROM Tabella WHERE Campo1 LIKE '%/%%' ESCAPE '/' SELECT ALL SUBSTRING(NomeRegione, 2, 1) AS lettera FROM Regioni ORDER BY SUBSTRING(NomeRegione, 2, 1) SELECT DISTINCT SUBSTRING(NomeRegione, 2, 1) AS lettera FROM Regioni ORDER BY SUBSTRING(NomeRegione, 2, 1) SELECT NomeRegione AS Nomi FROM Regioni UNION SELECT NomeProv FROM Province SELECT substring(NomeRegione,2,1) AS lettera, NomeRegione AS Nomi FROM Regioni UNION SELECT substring(NomeProv,2,1), NomeProv FROM Province SELECT substring(NomeRegione,2,1) AS lettera, NomeRegione AS Nomi FROM Regioni UNION SELECT substring(NomeProv,2,1), NomeProv FROM Province ORDER BY Nomi SELECT SUBSTRING(NomeRegione,2,1) AS lettera, NomeRegione AS Nomi, LEN(NomeRegione) AS lungh FROM Regioni COMPUTE SUM(LEN(NomeRegione)) SELECT substring(NomeRegione,2,1) AS lettera, NomeRegione AS Nomi, LEN(NomeRegione) AS lungh FROM Regioni COMPUTE SUM(LEN(NomeRegione)), AVG(LEN(NomeRegione)) SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Regioni INNER JOIN Province ON Regioni.CodRegione = Province.CodRegione ORDER BY NomeRegione,NomeProv SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Regioni INNER JOIN Province ON Regioni.CodRegione = Province.CodRegione WHERE NomeRegione = 'Veneto' ORDER BY NomeRegione,NomeProv SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Regioni LEFT OUTER JOIN Province ON Regioni.CodRegione = Province.CodRegione ORDER BY NomeRegione SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Regioni LEFT OUTER JOIN Province ON Regioni.CodRegione = Province.CodRegione WHERE NomeProv is null ORDER BY NomeRegione SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Province RIGHT OUTER JOIN Regioni ON Regioni.CodRegione = Province.CodRegione WHERE NomeProv is null ORDER BY NomeRegione SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Province FULL OUTER JOIN Regioni ON Regioni.CodRegione = Province.CodRegione WHERE (NomeRegione IS NULL OR NomeProv IS NULL) ORDER BY NomeRegione SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Regioni LEFT OUTER JOIN Province ON Regioni.CodRegione = Province.CodRegione WHERE NomeProv is null UNION SELECT Regioni.CodRegione AS Cod, NomeRegione, NomeProv FROM Regioni RIGHT OUTER JOIN Province ON Regioni.CodRegione = Province.CodRegione WHERE NomeRegione is null ORDER BY NomeRegione SELECT * FROM Tabella1 EXCEPT SELECT * FROM Tabella2 SELECT * FROM Tabella1 INTERSECT SELECT * FROM Tabella2 SELECT * FROM Tabella1 EXCEPT SELECT * FROM Tabella2 INTERSECT SELECT * FROM Tabella3 SELECT * FROM Tabella1 EXCEPT (SELECT * FROM Tabella2 INTERSECT SELECT * FROM Tabella3) ---------------------------------- CAPITOLO 14 ---------------------------------- -- istruzione sintetica CREATE LOGIN Mario WITH PASSWORD = 'Provvisoria' MUST_CHANGE; GO -- creazione di account Windows CREATE LOGIN [PC\Mario] FROM WINDOWS; GO -- per cambiare il nome dell'account ALTER LOGIN Mario WITH NAME = MarioDG; -- per cambiare password all'account MarioDG ALTER LOGIN MarioDG WITH PASSWORD = 'C1P8'; -- per attivare l'account Andrea03 ALTER LOGIN Andrea03 ENABLE; DROP LOGIN Mario ---------------------------------- CAPITOLO 15 ---------------------------------- -- creazione di un account di accesso CREATE LOGIN MRossi WITH PASSWORD '117KLQ41' -- selezione di un database USE NorthWind CREATE USER MarioR FOR LOGIN MRossi -- selezione di un database USE NorthWind -- modifica del nome utente ALTER USER Pippo WITH NAME = Giuseppe; -- selezione di un diverso database USE AdventureWorks -- modifica dello schema predefinito ALTER USER Giorgio WITH DEFAULT_SCHEMA = Vendite; DROP USER Antonio USE AziendaXY -- concessione dell'autorizzazione SELECT GRANT SELECT ON OBJECT::Dipendente.Indirizzo TO Rosanna; -- concessione dell'autorizzazione EXECUTE per l'esecuzione -- della stored procedure RisorseUmane.uspAggiornaDati -- al ruolo Personale7 GRANT EXECUTE ON OBJECT::RisorseUmane.uspAggiornaDati TO Personale7; USE AziendaXY -- concessione dell'autorizzazione SELECT DENY SELECT ON OBJECT::Dipendente.Indirizzo TO Rosanna; -- concessione dell'autorizzazione EXECUTE per l'esecuzione -- della stored procedure RisorseUmane.uspAggiornaDati -- al ruolo Personale7 DENY EXECUTE ON OBJECT::RisorseUmane.uspAggiornaDati TO Personale7; USE AziendaXY -- concessione dell'autorizzazione SELECT REVOKE SELECT ON OBJECT::Dipendente.Indirizzo TO Rosanna; -- concessione dell'autorizzazione EXECUTE per l'esecuzione -- della stored procedure RisorseUmane.uspAggiornaDati -- al ruolo Personale7 REVOKE EXECUTE ON OBJECT::RisorseUmane.uspAggiornaDati TO Personale7; ---------------------------------- CAPITOLO 16 ---------------------------------- DECLARE @cerca varchar(35) DECLARE @cerca varchar(35) = 'De Gh%' DECLARE @cerca varchar(35) ... SET @cerca = 'Mar%' SELECT Cognome, Nome, Telefono FROM Contatti WHERE Cognome LIKE @cerca; USE DBazienda -- dichiarazione di variabile di tipo tabella DECLARE @MiaTabella table( IDimpiegato int NOT NULL, GiorniFerie int) UPDATE TOP (10) Personale.Impiegati SET GiorniFerie = GiorniFerie * 1.25 OUTPUT INSERTED.IDimpiegato, DELETED.GiorniFerie, INSERTED.GiorniFerie, INTO @MiaTabella -- visualizza il risultato della variabile tabella SELECT IDimpiegato, GiorniFerie FROM @MiaTabella -- visualizza il risultato della tabella SELECT TOP (10) IDimpiegato, GiorniFerie FROM Personale.Impiegati -- qui ci sono una o più dichiarazioni SQL -- ... PRINT 'Fine dell'elaborazione.' USE Prova DECLARE @numero int SELECT @numero = COUNT(*) FROM Prova.dbo.Regioni PRINT 'Risultato: ' + CONVERT(varchar, @numero) -- dichiaro due variabili, @TESTO1 e @TESTO2 DECLARE @TESTO1 varchar DECLARE @TESTO2 varchar -- assegno un valore alle due variabili create SET @TESTO1 = 'Mario De Ghetto' SET @TESTO2 = 'Belluno' -- primo confronto tra le due variabili: le stringhe sono -- diverse e quindi il valore restituito è False IF @TESTO1 = @TESTO2 PRINT 'Stringhe uguali' ELSE PRINT 'Stringhe diverse' -- modifico il contenuto della prima variabile SET @TESTO1 = 'Belluno' -- secondo confronto tra le due variabili: le stringhe -- ora sono uguali e quindi il valore restituito è True IF @TESTO1 = @TESTO2 PRINT 'Stringhe uguali' ELSE PRINT 'Stringhe diverse' -- modifico ancora la prima variabile: tutto maiuscolo SET @TESTO1 = 'BELLUNO' -- terzo confronto tra le due variabili: le stringhe -- sono ancora uguali per l'impostazione delle regole -- di confronto (COLLATE) del database a -- "case insensitive" IF @TESTO1 = @TESTO2 PRINT 'Stringhe uguali' ELSE PRINT 'Stringhe diverse' USE Prova GO IF (SELECT COUNT(*) FROM Regioni) < 21 PRINT 'Non sono state inserite alcune Regioni o ' + 'Province Autonome nella tabella Regioni.' GO USE Prova GO IF (SELECT COUNT(*) FROM Regioni) < 21 -- questo non funziona, perché sono due dichiarazioni -- distinte: la prima inclusa e la seconda esclusa da IF PRINT 'Non sono state inserite alcune Regioni o ' PRINT 'Province Autonome nella tabella Regioni.' GO USE Prova GO IF (SELECT COUNT(*) FROM Regioni) < 21 BEGIN PRINT 'Non sono state inserite alcune Regioni o ' PRINT 'Province Autonome nella tabella Regioni.' END GO USE Prova GO IF (SELECT COUNT(*) FROM Regioni) = 21 PRINT 'La tabella Regioni contiene il ' + 'numero di record corretto' GO USE Prova DECLARE @risultato int SELECT @risultato = COUNT(*) FROM Prova.dbo.Regioni IF (@risultato = 21) PRINT 'La tabella Regioni contiene il ' + 'numero di record corretto' ELSE BEGIN IF (@risultato < 21) PRINT 'La tabella Regioni contiene un numero ' + 'INFERIORE di record.' ELSE PRINT 'La tabella Regioni contiene un numero ' + 'SUPERIORE di record.' END DECLARE @numero INT SET @numero = 0 WHILE @numero < 5 BEGIN PRINT @numero SET @numero += 1 END USE Prova DECLARE @numero INT SET @numero = 1 WHILE @numero < 6 BEGIN SELECT * FROM Province WHERE CodProv = @numero SET @numero += 2 END USE Prova -- dichiarazione di variabile di tipo tabella DECLARE @MiaTabella table( Codice varchar(3) NOT NULL, Descrizione varchar(30)) -- dichiarazione variabile di comodo DECLARE @numero INT SET @numero = 1 WHILE @numero < 6 BEGIN -- inserisce il risultato parziale INSERT INTO @MiaTabella SELECT CodProv AS Codice, NomeProv AS Descrizione FROM Province WHERE CodProv = @numero -- incrementa la variabile di comodo SET @numero += 2 END -- visualizza il risultato finale SELECT * FROM @MiaTabella SELECT CodProv AS Codice, NomeProv AS Descrizione FROM Province WHERE CodProv IN ('001','003','005') USE Prova -- dichiarazione di variabile di tipo tabella DECLARE @MiaTabella table( Codice varchar(3) NOT NULL, Descrizione varchar(30)) -- inserisce il primo risultato parziale INSERT INTO @MiaTabella SELECT CodProv AS Codice, 'Provincia di ' + NomeProv AS Descrizione FROM Province -- inserisce il primo risultato parziale INSERT INTO @MiaTabella SELECT CodRegione AS Codice, 'Regione: ' + NomeRegione AS Descrizione FROM Regioni -- visualizza il risultato finale SELECT * FROM @MiaTabella ORDER BY Descrizione USE Prova SELECT CodProv AS Codice, 'Provincia di ' + NomeProv AS Descrizione FROM Province UNION SELECT CodRegione AS Codice, 'Regione: ' + NomeRegione AS Descrizione FROM Regioni ORDER BY Descrizione DECLARE @numero INT SET @numero = 1 WHILE 1=1 BEGIN IF @numero = 7 GOTO Numero7 IF @numero = 25 GOTO Numero25 IF @numero > 25 BREAK GOTO Fine Numero7: BEGIN SELECT * FROM Province WHERE CodProv = 7 GOTO Fine END Numero25: BEGIN SELECT CodProv, NomeProvincia FROM Province WHERE CodProv = 25 GOTO Fine END Fine: SET @numero += 1 END -- ================================================ -- Template generated from Template Explorer using: -- Create Procedure (New Menu).SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in -- the definition of the procedure. -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE PROCEDURE -- Add the parameters for the stored procedure here <@Param1, sysname, @p1> = , <@Param2, sysname, @p2> = AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2> END GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE ContaRigheRegioni AS BEGIN SET NOCOUNT ON; DECLARE @numero int SELECT @numero = COUNT(*) FROM Regioni RETURN @numero END GO USE [NorthWind] GO /****** Object: StoredProcedure [dbo].[ContaRigheRegioni] Script Date: 02/02/2017 06:46:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[ContaRigheRegioni] AS BEGIN SET NOCOUNT ON; DECLARE @numero int SELECT @numero = COUNT(*) FROM Regioni RETURN @numero END USE [NorthWind] GO DECLARE @return_value int EXEC @return_value = [dbo].[ContaRigheRegioni] SELECT 'Return Value' = @return_value GO USE [NorthWind] GO DECLARE @return_value int EXEC @return_value = sys.sp_tables SELECT 'Codice di ritorno' = @return_value GO ---------------------------------- CAPITOLO 17 ---------------------------------- USE AdventureWorks2016CTP3 GO SELECT MIN(BirthDate) AS PiuAnziano, MAX(BirthDate) AS PiuGiovane FROM HumanResources.Employee GO SELECT @@Version; GO USE AdventureWorks2016CTP3 GO -- dichiarare le variabili che serviranno -- -- per gestire i dati delle singole righe -- DECLARE @Nome varchar(50), @Cognome varchar(50) -- punto 1: definire il cursore -- DECLARE MioCursore CURSOR SCROLL FOR SELECT FirstName, LastName FROM Person.Person -- punto 2: attivare il cursore -- OPEN MioCursore -- punto 3: prelevare la prima riga di dati -- FETCH FIRST FROM MioCursore INTO @Nome, @Cognome PRINT @Nome + ', ' + @Cognome PRINT '----------------------' -- punto 4: iniziare il ciclo -- WHILE @@FETCH_STATUS = 0 BEGIN -- punto 5: prelevare le righe in sequenza -- FETCH NEXT FROM MioCursore INTO @Nome, @Cognome PRINT @Nome + ', ' + @Cognome PRINT '----------------------' END -- punto 6: chiudere il cursore -- CLOSE MioCursore -- punto 7: rimuovere il cursore -- DEALLOCATE MioCursore DECLARE @Data date SET @Data = '2003/4/19' PRINT Year(@Data) DECLARE @Data1 date, @Data2 date SET @Data1 = '2003/4/19' SET @Data2 = '2012/9/5' PRINT Datediff(year, @Data1, @Data2) SELECT CEILING($123.45), CEILING($-123.45) SELECT FLOOR(123.45), FLOOR(-123.45) SELECT ROUND(123.9994, 3), ROUND(123.9995, 3) SELECT ROUND(123.4545, -1), ROUND(123.45, -2) SELECT COL_NAME(OBJECT_ID('Person.Person'), 5) AS 'Nome colonna'; SELECT COL_LENGTH('Person.Person', 'FirstName') AS 'Lungh. Nome', COL_LENGTH('Person.Person', 'Title') AS 'Lungh. Titolo' SELECT FILE_NAME(1) AS 'Nome file 1 (dati)', FILE_NAME(2) AS 'Nome file 2 (log)' EXEC sp_configure 'show advanced options', 1 RECONFIGURE GO EXEC sp_configure 'ad hoc distributed queries', 1 RECONFIGURE GO SELECT * FROM OPENDATASOURCE('SQLNCLI', 'Data Source=London\Payroll;Integrated Security=SSPI') .AdventureWorks2016CTP3.HumanResources.Employee SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=C:\DataFolder\Documents\TestExcel.xls;Extended Properties=EXCEL 5.0')...[Foglio1$] ; DECLARE @usr char(30) SET @usr = user SELECT 'The current user''s database username is: '+ @usr GO SELECT USER; GO EXECUTE AS USER = 'Mario'; GO SELECT USER; GO REVERT; GO SELECT USER; GO IF IS_MEMBER ('db_owner') = 1 PRINT 'L'utente corrente è membro di db_owner' ELSE IF IS_MEMBER ('db_owner') = 0 PRINT 'L'utente corrente non è membro di db_owner' ELSE IF IS_MEMBER ('db_owner') IS NULL PRINT 'ERRORE: il gruppo/ruolo indicato non è valido' GO -- L'istruzione SELECT è eseguita solo se -- l'utente è membro del gruppo Windows IF IS_MEMBER ('INTRANET\Personale') = 1 SELECT 'L'utente ' + USER + ' è membro di INTRANET\Personale.' GO SELECT SUBSTRING('SQL Server', 5, 3); SELECT LEFT('SQL Server', 3); SELECT RIGHT('SQL Server', 3); SELECT PATINDEX('%fi_mare%', 'prego firmare per ricevuta'); USE AdventureWorks2016CTP3 GO CREATE FUNCTION dbo.Eta (@dataOggi datetime, @dataNascita datetime) RETURNS integer AS BEGIN DECLARE @risultato integer SELECT @risultato = DATEDIFF("d", @dataOggi, @dataNascita) FROM HumanResources.Employee RETURN @risultato END GO SELECT HumanResources.Employee.BirthDate, dbo.Eta(HumanResources.Employee.BirthDate, GETDATE()) AS EtàGiorni FROM HumanResources.Employee