277
8.3 Optimisation du code SQL
-- boucle
DECLARE @CurrentContactID int
SELECT TOP 1 @CurrentContactID = ContactId
FROM Person.Contact ORDER BY ContactId
WHILE 1 = 1 BEGIN
PRINT @CurrentContactID
SELECT TOP 1 @CurrentContactID = ContactID
FROM Person.Contact
WHERE ContactID > @CurrentContactID
IF @@ROWCOUNT = 0 BREAK
END -- WHILE
GO
Mais les boucles ne sont pas toujours nécessaires. SQL est un langage déclaratif et
ensembliste, mais l’exécution de la requête par le moteur d’exécution est au final
séquentielle : il faut bien finir par parcourir les lignes l’une après l’autre. Cette caractéristique peut être mise à profit. Voici par exemple comment réaliser une
concaténation :
DECLARE @str VARCHAR(MAX)
SELECT @str = COALESCE(@str + ', ', '') + LastName
FROM Person.Contact
GROUP BY LastName
ORDER BY LastName
SELECT @str
À l'aide des fonctions SQL et des jointures, vous pouvez aussi réaliser des séparations et des pivots. Par exemple :
CREATE TABLE #citations (
auteur varchar(50),
phrase varchar (1000)
)
INSERT INTO #citations
SELECT 'Guitry', 'Il y a des gens sur qui on peut compter. Ce sont généralement
des gens dont on n''a pas besoin' UNION ALL
SELECT 'Cioran', 'Un homme ennuyeux est un homme incapable de s''ennuyer' UNION
ALL
SELECT 'Talleyrand', 'Les mécontents, ce sont des pauvres qui réfléchissent'
SELECT auteur,
NullIf(SubString(' ' + phrase + ' ' , id ,
CharIndex(' ' , ' ' + phrase + ' ' , id) - ID) , '') AS mot
FROM (SELECT ROW_NUMBER() OVER (ORDER BY NEWID()) as id
FROM sys.system_views) tally
CROSS JOIN #citations
8.3 Optimisation du code SQL
-- boucle
DECLARE @CurrentContactID int
SELECT TOP 1 @CurrentContactID = ContactId
FROM Person.Contact ORDER BY ContactId
WHILE 1 = 1 BEGIN
PRINT @CurrentContactID
SELECT TOP 1 @CurrentContactID = ContactID
FROM Person.Contact
WHERE ContactID > @CurrentContactID
IF @@ROWCOUNT = 0 BREAK
END -- WHILE
GO
Mais les boucles ne sont pas toujours nécessaires. SQL est un langage déclaratif et
ensembliste, mais l’exécution de la requête par le moteur d’exécution est au final
séquentielle : il faut bien finir par parcourir les lignes l’une après l’autre. Cette caractéristique peut être mise à profit. Voici par exemple comment réaliser une
concaténation :
DECLARE @str VARCHAR(MAX)
SELECT @str = COALESCE(@str + ', ', '') + LastName
FROM Person.Contact
GROUP BY LastName
ORDER BY LastName
SELECT @str
À l'aide des fonctions SQL et des jointures, vous pouvez aussi réaliser des séparations et des pivots. Par exemple :
CREATE TABLE #citations (
auteur varchar(50),
phrase varchar (1000)
)
INSERT INTO #citations
SELECT 'Guitry', 'Il y a des gens sur qui on peut compter. Ce sont généralement
des gens dont on n''a pas besoin' UNION ALL
SELECT 'Cioran', 'Un homme ennuyeux est un homme incapable de s''ennuyer' UNION
ALL
SELECT 'Talleyrand', 'Les mécontents, ce sont des pauvres qui réfléchissent'
SELECT auteur,
NullIf(SubString(' ' + phrase + ' ' , id ,
CharIndex(' ' , ' ' + phrase + ' ' , id) - ID) , '') AS mot
FROM (SELECT ROW_NUMBER() OVER (ORDER BY NEWID()) as id
FROM sys.system_views) tally
CROSS JOIN #citations
