A partir de SQL Server 2012, il semble assez facile de configurer les « Locked Pages » Il suffit que l’utilisateur du service ait le droit « Lock pages in memory »
En supprimant la condition « name = DBNAME() » dans ce script, on peut faire l’opération sur l’ensemble des bases d’une instance. Attention pour ce dernier script, changer le mode de compatibilité peut changer les plans d’exécution des requêtes et donc il est possible que certaines requêtes soient ralenties. Autre effet de bord, certaines fonctions peuvent devenir obsolètes d’une version à une autre de SQL Server, il conviendra de vérifier les effets de bord.
Après modifications de structures de tables, le script suivant permettra d’identifier les impacts sur les objets devenus invalides.
DECLARE @Name NVARCHAR(1000);
DECLARE ObjectCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + '.' + QUOTENAME(OBJECT_NAME(o.object_id))
FROM sys.objects AS o
WHERE type IN('FN', 'P', 'TF', 'TR', 'V ')
AND ISNULL(OBJECTPROPERTY(o.object_id, 'IsSchemaBound'), 0) = 0;
OPEN ObjectCursor;
FETCH NEXT FROM ObjectCursor INTO @Name;
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_refreshsqlmodule @Name;
END TRY
BEGIN CATCH
PRINT @Name + ' : ' + ERROR_MESSAGE();
END CATCH;
FETCH NEXT FROM ObjectCursor INTO @Name;
END;
CLOSE ObjectCursor;
DEALLOCATE ObjectCursor;
Lors de l’affectation à partir d’une requête s’il n’y a pas de valeur renvoyée, SET affectera NULL, alors que SELECT ne fera pas du tout l’affectation (donc la variable ne sera pas modifiée par rapport à sa valeur précédente)
DECLARE @SELECT VARCHAR(100) = 'SELECT'
DECLARE @SET VARCHAR(100) = 'SET'
SELECT @SELECT= 'NEW' WHERE 1=2
SET @SET = (SELECT 'NEW' WHERE 1=2 )
SELECT @SELECT AS [SELECT] , @SET AS [SET]
Il n’y a pas de différences de performance entre SET et SELECT.
STRING_AGG concatène les valeurs des expressions de chaîne et place les valeurs de séparateur entre elles. Le séparateur n’est pas ajouté à la fin de la chaîne.
Cette fonction est équivalente au stuff utilisé dans les précédentes versions de SQL Server
DECLARE @TAB TABLE(libe VARCHAR(100));
INSERT INTO @tab(libe) VALUES('Test'), ('TOTO'), ('Titi'), ('tutu');
SELECT ISNULL(STRING_AGG(LIBE, '/'), '') FROM @TAB;
SELECT STUFF((SELECT '/' + LIBE FROM @TAB FOR XML PATH('') ), 1, 1, '');
Autre Méthode :
DECLARE @TAB TABLE(libe VARCHAR(100));
INSERT INTO @tab(libe) VALUES('Test'), ('TOTO'), ('Titi'), ('tutu');
Declare @CONCAT VARCHAR(MAX) = ''
SELECT @CONCAT = @CONCAT + CASE WHEN @CONCAT != '' THEN '/' ELSE '' END + LIBE FROM @TAB
SELECT @CONCAT
Attention à l’encodage des fichiers « .sql » , notamment s’ils sont ensuite exécutés par SqlCmd, un mauvais encodage peut avoir pour effet de faire perdre des informations sur les caractères accentués.
Voilà ci dessous un exemple avec deux fichiers, l’un encodé en UTF8 et l’autre en UTF8-BOM