OVH Cloud OVH Cloud

execution dans un contexte

6 réponses
Avatar
christophe
Bonjour,

j'ai une SP que je voudrais mettre sur master, pour qu'elle puisse etre
appellée des differentes bases vu que ces des traitements communs, en plus
cela facillitera la maintenance de cette procedure.

toutefois il faut que je puisse utiliser un USE MABASE


et je n'yarrive pas elle reste sur master ce qui bien sur ne m'arrange pas ?
et quand j'utilise

Set @VAR = 'USE ' + @MABASE
Exec(@VAR)

PRINT db_name(db_id()) -- est bien ici je suis
toujours sur Master ?

comment puis je faire ???
Ch.

6 réponses

Avatar
Rudi Bruchez
christophe a écrit:

toutefois il faut que je puisse utiliser un USE MABASE



Bonjour,

Pourquoi donc ? Une procédure stockée préfixée par sp_ et posée dans Master
s'exécute dans le contexte de la base appelante.
Tu n'as pas besoin de faire un USE.

De plus, si tu fais un USE dans un EXEC, cela ne sera valable que dans le
contexte de ton EXEC, donc inutile.

-- Démo :
USE Master

DECLARE @VAR varchar(100)

Set @VAR = 'USE AdventureWorks'
Exec(@VAR)

SELECT DB_NAME()
-- Donne Master

--
Rudi Bruchez
Consultant indépendant SQL Server
MCDBA, MCT, SCJP2
http://www.babaluga.com/
Avatar
christophe
oui tu as raison je ne comprends pas pourquoi il ne le faisait pas ???
le use c'ete justement pour palier !

bon ben ca marche, promis j'arrete de faire la fete ;)



"Rudi Bruchez" <"rudi#no-spam#[at]babaluga.com"> a écrit dans le message de
news:17bgjkcgidw2d.ut0lv2g9iczi$
christophe a écrit:

toutefois il faut que je puisse utiliser un USE MABASE



Bonjour,

Pourquoi donc ? Une procédure stockée préfixée par sp_ et posée dans
Master
s'exécute dans le contexte de la base appelante.
Tu n'as pas besoin de faire un USE.

De plus, si tu fais un USE dans un EXEC, cela ne sera valable que dans le
contexte de ton EXEC, donc inutile.

-- Démo :
USE Master

DECLARE @VAR varchar(100)

Set @VAR = 'USE AdventureWorks'
Exec(@VAR)

SELECT DB_NAME()
-- Donne Master

--
Rudi Bruchez
Consultant indépendant SQL Server
MCDBA, MCT, SCJP2
http://www.babaluga.com/


Avatar
christophe
finalement ca ne marche pas correctement

je veux utiliser ce script en procedure dans master pour pouvoir l'appler de
n'importe quelle base.
mais vu que cela appel des vues systeme j'ai des messages d'erreur.


comment puis je faire pour appeler ce script et que ce dernier fonctionne
correctement ?

c'est issu de la doc




-- ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname sysname;
DECLARE @objectname sysname;
DECLARE @indexname sysname;
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command varchar(8000);
-- ensure the temporary table does not exist
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
-- conditionally select from the function, converting object and index IDs
to names.
SELECT
object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM work_to_do;

-- Open the cursor.
OPEN partitions;

-- Loop through the partitions.
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag;

WHILE @@FETCH_STATUS = 0
BEGIN;
SELECT @objectname = o.name, @schemaname = s.name
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;

SELECT @indexname = name
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;

SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;

-- 30 is an arbitrary decision point at which to switch between reorganizing
and rebuilding
IF @frag < 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname +
'.' + @objectname + ' REORGANIZE';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR,
@partitionnum);
EXEC (@command);
END;

IF @frag >= 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname +' ON ' + @schemaname +
'.' + @objectname + ' REBUILD';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR,
@partitionnum);
EXEC (@command);
END;
PRINT 'Executed ' + @command;

FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- drop the temporary table
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
GO
Avatar
Rudi Bruchez
christophe a écrit:

je veux utiliser ce script en procedure dans master pour pouvoir l'appler de
n'importe quelle base.
mais vu que cela appel des vues systeme j'ai des messages d'erreur.



Si tu utilises des vues systèmes, en effet elles vont s'exécuter dans le
contexte de la base qui contient l'objet. Pour éviter ça, tu as une
deuxième chose à faire : marquer ta procédure comme procédure système.

Pour cela, en SQL Server 2005 :
EXEC sys.sp_MS_marksystemobject nom_de_ta_procedure

--
Rudi Bruchez
Consultant indépendant SQL Server
MCDBA, MCT, SCJP2
http://www.babaluga.com/
Avatar
christophe
Exellent ce coup ci ca marche !!!

Nickel Merci les gars de votre precieuse aide !
mais comment savez vous tout ça ???

----- Original Message -----
From: "Rudi Bruchez" <"rudi#no-spam#[at]babaluga.com">
Newsgroups: microsoft.public.fr.sqlserver
Sent: Thursday, February 15, 2007 5:33 PM
Subject: Re: execution dans un contexte


christophe a écrit:

je veux utiliser ce script en procedure dans master pour pouvoir l'appler
de
n'importe quelle base.
mais vu que cela appel des vues systeme j'ai des messages d'erreur.



Si tu utilises des vues systèmes, en effet elles vont s'exécuter dans le
contexte de la base qui contient l'objet. Pour éviter ça, tu as une
deuxième chose à faire : marquer ta procédure comme procédure système.

Pour cela, en SQL Server 2005 :
EXEC sys.sp_MS_marksystemobject nom_de_ta_procedure

--
Rudi Bruchez
Consultant indépendant SQL Server
MCDBA, MCT, SCJP2
http://www.babaluga.com/


Avatar
Fred BROUARD
christophe a écrit :
Exellent ce coup ci ca marche !!!

Nickel Merci les gars de votre precieuse aide !
mais comment savez vous tout ça ???



parce que certains sont très vieux... ;-)

A +


----- Original Message ----- From: "Rudi Bruchez"
<"rudi#no-spam#[at]babaluga.com">
Newsgroups: microsoft.public.fr.sqlserver
Sent: Thursday, February 15, 2007 5:33 PM
Subject: Re: execution dans un contexte


christophe a écrit:

je veux utiliser ce script en procedure dans master pour pouvoir
l'appler
de
n'importe quelle base.
mais vu que cela appel des vues systeme j'ai des messages d'erreur.



Si tu utilises des vues systèmes, en effet elles vont s'exécuter dans le
contexte de la base qui contient l'objet. Pour éviter ça, tu as une
deuxième chose à faire : marquer ta procédure comme procédure système.

Pour cela, en SQL Server 2005 :
EXEC sys.sp_MS_marksystemobject nom_de_ta_procedure

--
Rudi Bruchez
Consultant indépendant SQL Server
MCDBA, MCT, SCJP2
http://www.babaluga.com/







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************