Web design and hosting, database, cloud and social media solutions that deliver business results
  • Soluzioni aziendali
    • automazione dei processi robotici
    • Software
    • Servizi database
      • Aggiornamento del server e servizi DBA
      • Integrazione dei dati
      • Power BI
      • Servizi di Datawarehouse
    • Sito Web Design
      • Design del logo
      • Gateway di pagamento
      • Localizzazione e traduzione web
      • Ottimizzazione del sito web
      • Sicurezza del sito
      • Strumenti tecnici
    • Servizi per gli affari
      • Microsoft Azure
      • Servizi Google Cloud
      • Servizi Web Amazon
    • Microsoft Office
    • Servizi di consulenza e gestione dei social media
  • Accademia
    • Il nostro ambiente di prova
    • Imparare a usare i database
      • Le basi
      • Ottieni una query aperta
      • Piano di manutenzione di SQL Server 2008
      • Utilizzo dei dati di SQL Server
      • Utilizzo delle date di SQL Server
      • Utilizzo delle funzioni di SQL Server
      • Utilizzo di SQL Server Pivot-Unpivot
      • Strumenti
    • Imparare il web design
      • Costruire il sistema di gestione dei contenuti di Ousia
      • ASP-NET
      • CSS
      • Utilizzo di JavaScript
    • Usando i social media
      • Chiedere una recensione su Google
      • Dimensioni delle immagini dei social media
      • Modifica di un account Facebook da personale a aziendale
      • Scegliere dove concentrare lo sforzo sui social media
      • Utilizzo dei metadati per impostare le immagini dei social media
    • Imparare a usare il cloud e i servizi informatici
      • Errore dell'utilità di pianificazione 2147943645
      • Richiesta SSL e generazione di file PFX in OpenSSL Simple Steps
  • Chi Siamo
    • Carriere
      • Traduttore inglese-portoghese
      • Traduttore inglese-spagnolo
    • Portfolio
    • Squadra
      • Adrian Anandan
      • Alì Al Amine
      • Ayse Hur
      • Chester Copperpot
      • Gavin Clayton
      • Sai Gangu
      • Suneel Kumar
      • Surya Mukkamala
عربى (AR)čeština (CS)Deutsch (DE)English (EN-GB)English (EN-US)Español (ES)فارسی (FA)Français (FR)हिंदी (HI)italiano (IT)日本語 (JA)polski (PL)Português (PT)русский (RU)Türk (TR)中国的 (ZH)

Introduzione alle funzioni di SQL Server, ai loro vantaggi e svantaggi

Qualsiasi database ben scritto avrà una selezione di funzioni, il più delle volte sono utili ma se utilizzate nel contesto sbagliato possono effettivamente danneggiare le prestazioni

Che cos'è una funzione SQL?

Utilizzo delle funzioni di SQL Server

Le funzioni di SQL Server possono essere usate per restituire valori singoli (scalatori) o tabelle, usando routine T-SQL o CLR (Common Language Runtime) e spesso eseguendo calcoli più complessi di quelli che vorresti usare nel codice generale.

Quando è una buona idea usare una funzione anziché un codice inline?

Buon uso

Le funzioni possono essere utilizzate per sostituire le views (che restituiscono una tabella), come una colonna calcolata in una tabella, eseguire azioni di ricerca coerenti o semplicemente per modularizzare il codice che può aiutare a ridurre le modifiche necessarie.

Cattivo uso

Lo vediamo sempre, ma le funzioni non dovrebbero essere utilizzate per restituire dati di ricerca al posto di un join quando si ha a che fare con set di dati di grandi dimensioni. Ogni riga chiamerà la stessa funzione anche se ha già riscontrato quel valore. In questi casi, utilizzare un join.

Esempi di funzioni scalari

Le funzioni scalari sono utilizzate al meglio per eseguire azioni logiche come la riformattazione o i calcoli basati su riga poiché per loro natura sono chiamate per ogni riga, possono essere utilizzate per cercare dati in un'altra tabella, ma in generale otterrai prestazioni migliori utilizzando JOIN. Per questo, possiamo guardare la nostra funzione get age sul seguente link.

Non avrebbe senso memorizzare l'età di una persona nel momento in cui ha compilato un modulo, poiché quando i dati vengono interrogati in un secondo momento non saranno aggiornati. Un'opzione migliore sarebbe quella di acquisire una data di nascita e calcolarla al volo. Nella nostra funzione abbiamo aggiunto un campo fino a quando, che può essere utilizzato per retrodatare un calcolo, o forse più cupamente, calcolare l'età e l'ora della morte (questa funzione è stata estesa per un contratto SSN).

Altro: Ottieni età

Esempio

CREATE FUNCTION [Dates].[GetAge](@Date DATETIME2,@Until DATETIME2) RETURNS INT AS BEGINIF @Until IS NULL SET @Until=CONVERT(DATE,GETDATE())DECLARE @Age INT=DATEDIFF(YEAR,@Date,@Until)+(CASE WHEN DATEPART(DAYOFYEAR,@Date)>(DATEPART(DAYOFYEAR,@Until)+(CASE WHEN dbo.GetLeapYear(@Date)=1 AND DATEPART(DAYOFYEAR,@Date)>59 THEN 1 ELSE 0 END))THEN -1 ELSE 0 END)RETURN @AgeEND

Esempi di funzioni scalari

Per usarlo da una tabella immaginaria useremmo semplicemente questo, che fornirebbe l'età attuale o l'età alla morte.

Utilizzatelo in un SELECT

SELECT [PersonID],[DateOfBirth],[dbo].[GetAge]([DateOfBirth],[DeceasedDate]) AgeAsFunction,--Simpler code to understand!DATEDIFF(YEAR,[DateOfBirth],[DeceasedDate])+(CASE WHEN DATEPART(DAYOFYEAR,[DateOfBirth])>(DATEPART(DAYOFYEAR,[DeceasedDate])+(CASE WHEN dbo.GetLeapYear([DateOfBirth])=1 AND DATEPART(DAYOFYEAR,[DateOfBirth])>59 THEN 1 ELSE 0 END))THEN -1 ELSE 0 END) AgeAsScript,[DeceasedDate]FROM [Person]

Esempi di funzioni scalari

Vantaggi : coerente, modulare, più compatto, riduce potenzialmente il numero di modifiche

Svantaggi : per vedere il codice è necessario guardare nella funzione

Sebbene sia generalmente utile, questa funzione è anche estremamente precisa, poiché utilizza una funzione di anno bisestile. Non è deterministico per natura, quindi non dovrebbe mai essere archiviato come dati persistenti.

Esempi di colonne di tabelle

Le colonne calcolate possono essere aggiunte come persistenti (cambia quando i dati lo fanno) o non persistenti (calcolate ogni volta che viene selezionata la riga). Possiamo esaminare due modi in cui li abbiamo usati qui all'interno del nostro sistema di gestione dei contenuti.

Nota : i dati persistenti possono essere più difficili da ottenere poiché richiedono il rispetto di una serie di vincoli

Non persistente: Età

Usando la funzione età come sopra, possiamo aggiungerlo in una tabella e passare i valori da altre colonne. Quindi lo selezioniamo semplicemente come colonna.

Aggiungi una tabella

CREATE TABLE [Person]([PersonID] [int] IDENTITY(1,1) NOT NULL,[DateOfBirth] [datetime] NULL,[Age] AS ([dbo].[GetAge]([DateOfBirth],[DeceasedDate])),[DeceasedDate] [datetime] NULL)

Select Statement

SELECT [PersonID],[DateOfBirth],[Age] AgeAsColumn,--Even simpler code to understand!DATEDIFF(YEAR,[DateOfBirth],[DeceasedDate])+(CASE WHEN DATEPART(DAYOFYEAR,[DateOfBirth])>(DATEPART(DAYOFYEAR,[DeceasedDate])+(CASE WHEN dbo.GetLeapYear([DateOfBirth])=1 AND DATEPART(DAYOFYEAR,[DateOfBirth])>59 THEN 1 ELSE 0 END))THEN -1 ELSE 0 END) AgeAsScript,[DeceasedDate]FROM [Person]

Non persistente: Età

Vantaggi : Coerente, modulare

Svantaggi : rallenta la velocità delle query se non necessario.

Persistito: CSS minimizzato

Abbiamo una funzione che riduce lo spazio necessario per CSS fino al 30%. Chiamarlo regolarmente rallenterebbe la velocità di selezione della tabella e poiché i dati vengono aggiornati raramente, aveva senso eseguire calcoli al momento dell'inserimento/aggiornamento. Creando la colonna come funzione, non abbiamo nemmeno bisogno di eseguire queste operazioni come trigger.

Altro: CSS Pre Processor in SQL

Aggiungi una tabella

CREATE TABLE CSS(CSSID INT IDENTITY(1,1) NOT NULL,CSSText NVARCHAR(MAX),CSSMin AS (ous.CSSProcessor([CSSText])) PERSISTED)

Persistito: CSS minimizzato

Può essere selezionato proprio come una normale colonna e i dati vengono archiviati nella tabella. Evita anche l'uso di una massiccia istruzione di sostituzione che gonfia il nostro codice.

Vantaggi : velocità di selezione coerente, modulare, più veloce, non c'è bisogno di un Trigger!

Svantaggi : Aumenta lo spazio necessario per la tavola, rallenta la velocità di inserimento

Sostituzione di una view

Tendiamo a non utilizzare le view, a parte quando utilizziamo regolarmente gli stessi join in più luoghi.

Anche in questi casi, non c'è motivo per cui una funzione di tabella non possa essere utilizzata in modo più efficace. La tabella che abbiamo utilizzato può essere trovata sul collegamento sottostante e abbiamo due esempi di utilizzo, uno tramite una funzione e l'altro tramite una vista.

altro: Utilizzo delle date di SQL Server

Creazione di una funzione

CREATE FUNCTION Dates.GetCalender(@DateFrom DATETIME2,@DateTo DATETIME2,@Function INT) RETURNS @D TABLE (CalenderDate DATETIME2(7) NOT NULL PRIMARY KEY,CalenderCA INT NULL,CalenderCD INT NULL,WeekDayID INT NULL,WeekDayName VARCHAR(9) NULL,HolidayType NVARCHAR(100)) AS BEGININSERT INTO @DSELECT c.*,HolidayTypeFROM [Utilities].[Dates].[Calender] cLEFT JOIN Utilities.Dates.CalenderHolidays h ON h.CalenderDate=c.CalenderDate AND CalenderFunction=@FunctionWHERE c.CalenderDate BETWEEN @DateFrom AND @DateTo RETURNENDGO

Creazione di una View

CREATE VIEW Dates.GetCalenderView ASSELECT c.CalenderDate, CalenderCA, CalenderCD, WeekDayID, WeekDayName,h.HolidayType,c.CalenderFunctionFROM (SELECT CalenderDate, CalenderCA, CalenderCD, WeekDayID, WeekDayName, CalenderFunction FROM [Utilities].[Dates].[Calender],(SELECT DISTINCT CalenderFunction FROM Dates.CalenderHolidays) x) cLEFT JOIN Utilities.Dates.CalenderHolidays h ON h.CalenderDate=c.CalenderDate AND h.CalenderFunction=c.CalenderFunction

Utilizzo

SELECT * FROM Dates.GetCalender('2018-01-01','2018-12-31',0) --England & WalesSELECT * FROM Dates.GetCalender('2018-01-01','2018-12-31',1) --Scotland----OR----SELECT * FROM Dates.GetCalenderView WHERE CalenderDate BETWEEN '2018-01-01' AND '2018-12-31' AND CalenderFunction=0

Sostituzione di una view

Vantaggi : Compatto da chiamare, restituito con chiave primaria (perfetto per ulteriori join), i parametri possono essere utilizzati in precedenza nel codice.

Svantaggi : più codice da costruire, meno flessibile

Utilizzare in Apply join

Le funzioni tabella sono ottime da usare in Apply Join, poiché i dati possono essere passati riga per riga. Usiamo la nostra funzione TextToRows per separare le stringhe in SQL Server. Nell'esempio seguente utilizziamo una doppia applicazione per dividere i dati due volte con diversi delimitatori.

altro: funzione di SQL Server che divide il testo in righe di dati

Codice SQL 

DECLARE @TestText TABLE(TextToSplit NVARCHAR(100))INSERT INTO @TestText SELECT 'Text,To,Tows:Split,One'INSERT INTO @TestText SELECT 'Text,To,Tows:Split,Two'SELECT t.TextToSplit,s1.WordInt,s1.WordStr,s2.WordInt,s2.WordStrFROM @TestText tOUTER APPLY dbo.TextToRows(':',TextToSplit) s1OUTER APPLY dbo.TextToRows(',',WordStr) s2

Maggiori dettagli

Alcune delle funzioni che abbiamo scritto possono essere trovate di seguito.

Copyright Claytabase Ltd 2020

Registered in England and Wales 08985867

Site Links

RSSLoginLink Cookie PolicyMappa del sito

Social Media

facebook.com/Claytabaseinstagram.com/claytabase/twitter.com/Claytabaselinkedin.com/company/claytabase-ltd

Get in Touch

+442392064871info@claytabase.comClaytabase Ltd, Unit 3d, Rink Road Industrial Estate, PO33 2LT, United Kingdom

Partnered With

Le impostazioni di questo sito sono impostate per consentire tutti i cookie. Questi possono essere modificati sulla nostra pagina politica e le impostazioni dei cookie. Continuando a utilizzare questo sito l'utente accetta l'utilizzo dei cookie.
Ousia Logo
Logout
Ousia CMS Loader