Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/04/2011, 17h03   #1
Invité régulier
 
Inscription : septembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 40
Points : 8
Points : 8
Par défaut Convertir contenu d'un champ en requête sql

Bonjour,

J'ai une table "Toto" qui a un champ "Rq_SQL".
Ce champ contient une requête sql de type SELECT.
Code :
Toto.Rq_SQL = "Select count(id_client) from Tb_Clients where len(id_client)>6"
La table "Toto" contient x enregistrements contiennent chacun une requête.
J'ai fait un curseur qui lit la table et exécute la requête qui est contenu dans le champ Toto.Rq_SQL en utilisant la procédure stockée système sp_executesql, mais je n'arrive pas à récupérer le résultat de la requête pour l'insérer dans un champs d'une autre table.
Si je fais sp_execute [requete], paramètre1 output ,@Nb output
ça fonctionne bien.
ça affiche le résultat correct dans SQL Server
Mais je n'arrive pas à mettre le résultat du sp_execute dans une variable.
Ma variable est toujours vide.
Petite précision : La requête que j'exécute n'a pas de paramètres.

Avez-vous un exemple d'utilisation de sp_executesql ou avez-vous une autre idée pour récupérer le résultat de la requête dans une variable ?

Merci d'avance.
Boubou_s
boubou_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 10h14   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

C'est en fait un peu plus compliqué que cela.
Pour récupérer la valeur de votre requête (en supposant donc que toute les requêtes retournent un entier), vous devez déclarer une variable de sortie et l'affecter dans votre chaîne requête.

Pour faire un test, j'ai donc créé et peuplé la table suivante :

Code :
1
2
3
4
5
6
7
8
CREATE TABLE Tb_Clients
(
	id_client varchar(10) NOT NULL CONSTRAINT PKTb_Clients PRIMARY KEY
)
GO
 
INSERT	dbo.Tb_Clients VALUES ('1234567'), ('123456'), ('1234'), ('7654321')
GO
J'ai modifié votre table toto :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE toto
(
	nom_table sysname
	, rq_sql nvarchar(1024) NOT NULL
	, rq_sql_variable_declaration nvarchar(1024)
	, rq_sql_variable_affectation varchar(1024)
	, traite bit NOT NULL CONSTRAINT DFtoto_traite DEFAULT (0)
)
GO
 
INSERT	dbo.toto (nom_table, rq_sql, rq_sql_variable_declaration, rq_sql_variable_affectation)
VALUES ('Tb_Clients', 'SELECT @count_out = COUNT(*) FROM dbo.Tb_Clients WHERE LEN(id_client) > 6', '@count_out int OUTPUT', '@count_out = @count_out')
GO
Et j'ai créé la procédure stockée suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CREATE PROCEDURE usp_get_table_count
	@_nom_table sysname
AS
BEGIN
	SET NOCOUNT ON
 
	DECLARE @sql nvarchar(max)
		, @rq_sql varchar(1024)
		, @rq_sql_variable_declaration nvarchar(1024)
		, @rq_sql_variable_affectation varchar(1024)
		, @count_out int
 
	SELECT	@rq_sql = rq_sql
		, @rq_sql_variable_declaration = rq_sql_variable_declaration
		, @rq_sql_variable_affectation = rq_sql_variable_affectation
	FROM	dbo.toto
	WHERE	nom_table = @_nom_table
 
	IF @rq_sql IS NULL
	BEGIN
		RAISERROR('La table %s n''a pas de requête', 16, 1, @_nom_table)
		RETURN
	END
 
	SET	@sql = 'EXEC sp_executeSQL N''' + @rq_sql
				+ ''', N''' + @rq_sql_variable_declaration
				+ ''', ' + @rq_sql_variable_affectation + ' OUTPUT'
 
	EXEC sp_executeSQL 
		@sql
		, N'@count_out int OUTPUT'
		, @count_out = @count_out OUTPUT
 
	SELECT	@_nom_table AS nom_table
		, @count_out AS occurences
END
GO
Dans cet exemple, l'exécution suivante :

Code :
EXEC dbo.usp_get_table_count 'Tb_Clients'

Me retourne :



Il vous suffit donc maintenant d'appeler cette procédure dans votre c... ha ! j'arrive pas à le taper !

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h53   #3
Invité régulier
 
Inscription : septembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 40
Points : 8
Points : 8
Merci Elsuket, finalement j'ai trouvé exactement ce que vous avez marqué dans votre message.

En tout cas merci pour votre message et votre implication et je pense que cela pourra servir à d'autres débutants en Transact-SQL comme moi.
Encore merci.
boubou_s est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h23.


 
 
 
 
Partenaires

Hébergement Web