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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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.
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$.dlg@40tude.net...
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.
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.
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;
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
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;
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
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;
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
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
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
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
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
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
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
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
-- 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 ***********************
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
--
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 ***********************
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
-- 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 ***********************