OVH Cloud OVH Cloud

SELECT sur une table désignée par une variable

5 réponses
Avatar
olaf_le_preux
Bonjour,
Je voudrais faire un SELECT sur une table dont le nom soit=20
contenue dans une variable.
J'essaye :

DECLARE @VarTable as varchar(10)
SET @VarTable=3D'dbo.sales'
SELECT * FROM @VarTable


Et j'obtiens :
"Serveur : Msg 137, Niveau 15, =C9tat 2, Ligne 4
La variable '@VarTable' doit =EAtre d=E9clar=E9e."

Quelqu'un sait-il comment faire ?

5 réponses

Avatar
Sylvain Lafontaine
Comme votre requête SQL doit être recompilée à chaque exécution, il ne
s'agit pas vraiment de l'utilisation simple d'une variable dans une
procédure stockée ici. De plus, vous voulez retourner les valeurs à l'aide
d'un SELECT *, ce qui complique d'autant plus les choses car le résultat du
SELECT peut varier d'un appel à l'autre.

Normalement, cela signifie que la logique que vous voulez utiliser ici n'est
probablement pas la bonne et repenser votre façon de voir.

En réponse à votre question, si vous n'utilisez pas de SELECT *, vous devez
mettre votre requête SQL au complet dans une chaîne de caractère et
l'appeler à l'aide de l'instruction: EXECUTE « chaîne de caractère ».

Comme vous voulez aller plus loin et retournez le résultat à l'aide de
SELECT *, vous devez utiliser une des instructions suivantes: OPENDATASET,
OPENROWSOURCE et OPENQUERY et utiliser (local) comme serveur distant, je
crois. (Je ne me souviens plus des détails exacts. Vous pouvez également
créer un serveur distant lié pointant sur lui-même.)

Utiliser une table temporaire et faire un insert dedans à l'aide de
l'instruction EXEC ne serait également pas une mauvaise idée.

S. L.

"olaf_le_preux" wrote in message
news:01b001c48b9e$088257b0$
Bonjour,
Je voudrais faire un SELECT sur une table dont le nom soit
contenue dans une variable.
J'essaye :

DECLARE @VarTable as varchar(10)
SET @VarTable='dbo.sales'
SELECT * FROM @VarTable


Et j'obtiens :
"Serveur : Msg 137, Niveau 15, État 2, Ligne 4
La variable '@VarTable' doit être déclarée."

Quelqu'un sait-il comment faire ?
Avatar
Olaf_Le_Preux
Cette méthode m'interesse mais j' obtiens le message :

"Le fournisseur OLE DB 'Microsoft.Jet.OLEDB.4.0' rapporte
une erreur.
[OLE/DB provider returned message: Pilote ISAM
introuvable.]"

Manque-t-il un fichier à installer ??

Merci d'avance


-----Message d'origine-----
Comme votre requête SQL doit être recompilée à chaque


exécution, il ne
s'agit pas vraiment de l'utilisation simple d'une


variable dans une
procédure stockée ici. De plus, vous voulez retourner


les valeurs à l'aide
d'un SELECT *, ce qui complique d'autant plus les choses


car le résultat du
SELECT peut varier d'un appel à l'autre.

Normalement, cela signifie que la logique que vous voulez


utiliser ici n'est
probablement pas la bonne et repenser votre façon de voir.

En réponse à votre question, si vous n'utilisez pas de


SELECT *, vous devez
mettre votre requête SQL au complet dans une chaîne de


caractère et
l'appeler à l'aide de l'instruction: EXECUTE « chaîne de


caractère ».

Comme vous voulez aller plus loin et retournez le


résultat à l'aide de
SELECT *, vous devez utiliser une des instructions


suivantes: OPENDATASET,
OPENROWSOURCE et OPENQUERY et utiliser (local) comme


serveur distant, je
crois. (Je ne me souviens plus des détails exacts. Vous


pouvez également
créer un serveur distant lié pointant sur lui-même.)

Utiliser une table temporaire et faire un insert dedans à


l'aide de
l'instruction EXEC ne serait également pas une mauvaise


idée.

S. L.

"olaf_le_preux"


wrote in message
news:01b001c48b9e$088257b0$
Bonjour,
Je voudrais faire un SELECT sur une table dont le nom soit
contenue dans une variable.
J'essaye :

DECLARE @VarTable as varchar(10)
SET @VarTable='dbo.sales'
SELECT * FROM @VarTable


Et j'obtiens :
"Serveur : Msg 137, Niveau 15, État 2, Ligne 4
La variable '@VarTable' doit être déclarée."

Quelqu'un sait-il comment faire ?


.



Avatar
olaf_le_preux
La méthode que j'emploie :

USE BIJOUSQL
GO
SELECT Temoin
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'M:Access7ConnectSql.mdb', dbo.F_ARTICLE)
AS a
GO


engendre l'erreur :

"Le fournisseur OLE DB 'Microsoft.Jet.OLEDB.4.0' rapporte
une erreur.
[OLE/DB provider returned message: Pilote ISAM
introuvable.]"

Manque-t-il un fichier ??????



-----Message d'origine-----
Comme votre requête SQL doit être recompilée à chaque


exécution, il ne
s'agit pas vraiment de l'utilisation simple d'une


variable dans une
procédure stockée ici. De plus, vous voulez retourner


les valeurs à l'aide
d'un SELECT *, ce qui complique d'autant plus les choses


car le résultat du
SELECT peut varier d'un appel à l'autre.

Normalement, cela signifie que la logique que vous voulez


utiliser ici n'est
probablement pas la bonne et repenser votre façon de voir.

En réponse à votre question, si vous n'utilisez pas de


SELECT *, vous devez
mettre votre requête SQL au complet dans une chaîne de


caractère et
l'appeler à l'aide de l'instruction: EXECUTE « chaîne de


caractère ».

Comme vous voulez aller plus loin et retournez le


résultat à l'aide de
SELECT *, vous devez utiliser une des instructions


suivantes: OPENDATASET,
OPENROWSOURCE et OPENQUERY et utiliser (local) comme


serveur distant, je
crois. (Je ne me souviens plus des détails exacts. Vous


pouvez également
créer un serveur distant lié pointant sur lui-même.)

Utiliser une table temporaire et faire un insert dedans à


l'aide de
l'instruction EXEC ne serait également pas une mauvaise


idée.

S. L.

"olaf_le_preux"


wrote in message
news:01b001c48b9e$088257b0$
Bonjour,
Je voudrais faire un SELECT sur une table dont le nom soit
contenue dans une variable.
J'essaye :

DECLARE @VarTable as varchar(10)
SET @VarTable='dbo.sales'
SELECT * FROM @VarTable


Et j'obtiens :
"Serveur : Msg 137, Niveau 15, État 2, Ligne 4
La variable '@VarTable' doit être déclarée."

Quelqu'un sait-il comment faire ?


.



Avatar
Sylvain Lafontaine
Fort possible, mais comme je n'utilise pas OpenRowset, je ne peux donc pas
en dire beaucoup là-dessus.

Dans votre cas, vous pouvez vérifier que le pilote indiqué dans votre chaîne
de connection est correcte en utilisant dans un autre programme, comme une
page ASP par exemple ou encore en créant un serveur lié sur SQL-Server.

S. L.

"olaf_le_preux" wrote in message
news:38ce01c48f83$bdab89c0$
La méthode que j'emploie :

USE BIJOUSQL
GO
SELECT Temoin
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'M:Access7ConnectSql.mdb', dbo.F_ARTICLE)
AS a
GO


engendre l'erreur :

"Le fournisseur OLE DB 'Microsoft.Jet.OLEDB.4.0' rapporte
une erreur.
[OLE/DB provider returned message: Pilote ISAM
introuvable.]"

Manque-t-il un fichier ??????



-----Message d'origine-----
Comme votre requête SQL doit être recompilée à chaque


exécution, il ne
s'agit pas vraiment de l'utilisation simple d'une


variable dans une
procédure stockée ici. De plus, vous voulez retourner


les valeurs à l'aide
d'un SELECT *, ce qui complique d'autant plus les choses


car le résultat du
SELECT peut varier d'un appel à l'autre.

Normalement, cela signifie que la logique que vous voulez


utiliser ici n'est
probablement pas la bonne et repenser votre façon de voir.

En réponse à votre question, si vous n'utilisez pas de


SELECT *, vous devez
mettre votre requête SQL au complet dans une chaîne de


caractère et
l'appeler à l'aide de l'instruction: EXECUTE « chaîne de


caractère ».

Comme vous voulez aller plus loin et retournez le


résultat à l'aide de
SELECT *, vous devez utiliser une des instructions


suivantes: OPENDATASET,
OPENROWSOURCE et OPENQUERY et utiliser (local) comme


serveur distant, je
crois. (Je ne me souviens plus des détails exacts. Vous


pouvez également
créer un serveur distant lié pointant sur lui-même.)

Utiliser une table temporaire et faire un insert dedans à


l'aide de
l'instruction EXEC ne serait également pas une mauvaise


idée.

S. L.

"olaf_le_preux"


wrote in message
news:01b001c48b9e$088257b0$
Bonjour,
Je voudrais faire un SELECT sur une table dont le nom soit
contenue dans une variable.
J'essaye :

DECLARE @VarTable as varchar(10)
SET @VarTable='dbo.sales'
SELECT * FROM @VarTable


Et j'obtiens :
"Serveur : Msg 137, Niveau 15, État 2, Ligne 4
La variable '@VarTable' doit être déclarée."

Quelqu'un sait-il comment faire ?


.



Avatar
Fred BROUARD
on ne peut mettre une variable dans une requête (paramètre) qu'a condition
qu'elle représente une valeur "évaluable".

En aucun cas un nom d'objet n'est évaluable et donc il est impossible de mettre
le nom d'une colonne, d'une table ou d'une clause en paramètre !

En revanche on peut utiliser du SQL dynamique, sachant que SQL Server permet
d'executer n'importe quelle chaîne de caractères...

Exemple :
EXECUTE ('SELECT * FROM INFORMATION_SCHEMA.TABLES')

Dans ton cas :

DECLARE @NOM_TABLE VARCHAR(128)
SET @NOM_TABLE = 'INFORMATION_SCHEMA.TABLES'
EXECUTE ('SELECT * FROM '+@NOM_TABLE)

A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

olaf_le_preux a écrit:
Bonjour,
Je voudrais faire un SELECT sur une table dont le nom soit
contenue dans une variable.
J'essaye :

DECLARE @VarTable as varchar(10)
SET @VarTable='dbo.sales'
SELECT * FROM @VarTable


Et j'obtiens :
"Serveur : Msg 137, Niveau 15, État 2, Ligne 4
La variable '@VarTable' doit être déclarée."

Quelqu'un sait-il comment faire ?