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 »
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