Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de syntaxe sql

4 réponses
Avatar
John
Bonjour,

J'ai un problème de syntaxe que je n'arrive pas à régler.

J'essaie d'écrire des procédures de recherche "génériques".
Je récupère comme paramètres soit l'id, soit une valeur alphanumérique
(code, nom, etc...)

J'ai une procédure de recherche générale que j'essaie d'écrire de la sorte

CREATE PROCEDURE dbo].[Recherche]
@id int = NULL,
@Code varchar(50) = NULL


AS

declare @idValue int

if @id is not null
set @idValue = @id
else
execute General_Select_ID
'Nom_du_champ','Nom_de_la_table','Nom_de_la_colonne',@Code,@IDValue output

select * from myTable where myField =@IDValue


Avec la procédure General_Select_ID écrite de la sorte

CREATE PROCEDURE [dbo].[General_Select_ID]
@fieldName varchar(50),
@tableName varchar(50),
@columnName varchar(50),
@fieldValue varchar(50),
@IDValue int output

AS

declare @sqlStatement varchar(2000)

SET NOCOUNT ON;
set @sqlStatement = 'select @IDValue=' + @fieldName + ' from
'+@tableName+ ' where '+ @columnName +' = '+''+ @fieldValue+''
execute (@sqlStatement)


Mais ça ne fonctionne pas.

J'ai le message d'erreur suivant
La variable scalaire "@IDValue" doit être déclarée.

J'ai "l'impression" que le execute fait qu'il ne "reconnait" pas la variable
output.
Que se passe t-il exactement ?
Et Comment puis-je faire ?

Merci

4 réponses

Avatar
rudi bruchez
John a écrit:

set @sqlStatement = 'select @IDValue=' + @fieldName + ' from
'+@tableName+ ' where '+ @columnName +' = '+''+ @fieldValue+''
execute (@sqlStatement)



Bonjour,

Ton SQL dynamique s'exécute dans un scope où ta variable (qui est locale)
n'existe pas.
Tu peux régler le problème en utilisant sp_executesql au lieu de EXEC(),
voir ceci : http://support.microsoft.com/default.aspx/kb/262499

P.S. fais attention avec ta recherche générique sur les grandes tables,
permettre de recherche sur toutes les colonnes sans contrôle peut conduire
à de très mauvaises performances.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/
Avatar
John
Merci.

Justement qu'entends-tu par "grande table"

Si je comprends bien, ce genre de requête exclut l'utilisation des index
mais à partir de combien d'enregistrement est-ce vraiment pénalisant ?



"rudi bruchez" <rudi#nospam#@babaluga.com> wrote in message
news:%
John a écrit:

> set @sqlStatement = 'select @IDValue=' + @fieldName + ' from
> '+@tableName+ ' where '+ @columnName +' = '+''+ @fieldValue+''
> execute (@sqlStatement)

Bonjour,

Ton SQL dynamique s'exécute dans un scope où ta variable (qui est locale)
n'existe pas.
Tu peux régler le problème en utilisant sp_executesql au lieu de EXEC(),
voir ceci : http://support.microsoft.com/default.aspx/kb/262499

P.S. fais attention avec ta recherche générique sur les grandes tables,
permettre de recherche sur toutes les colonnes sans contrôle peut conduire
à de très mauvaises performances.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/


Avatar
rudi bruchez
John a écrit:

Si je comprends bien, ce genre de requête exclut l'utilisation des index
mais à partir de combien d'enregistrement est-ce vraiment pénalisant ?



Bonjour,

Ce type de requête n'exclut pas du tout l'utilisation des index. Quand il y
a un index sur la colonne, il sera utilisé (s'il est suffisamment
sélectif). Ce que je veux dire est qu'en général on fait ce type de sql
générique pour permettre de faire des recherche sur toutes les colonnes. Il
est bien plus difficile d'optimiser sa base si tu ne sais pas quelles sont
les requêtes qui vont y être envoyées. Quand tu ne maîtrise pas le code
envoyé au serveur, tu peux t'attendre à des problèmes de performances,
notamment sur les colonnes non indexées.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/
Avatar
John
Bonjour,

Dans mon cas, je souhaiterais utiliser ce type de requête afin d'avoir à
multiplier les SP qui cherchent sur un code ou sur un ID.
J'envoie comme "paramètre" le nom de la table, la colonne de recherche et la
colonne recherchée.

Mais peut être est-ce finalement plus compliqué à "maintenir" surtout si
d'autres se plongent dans le code.

Merci


"rudi bruchez" <rudi#nospam#@babaluga.com> wrote in message
news:%
John a écrit:

> Si je comprends bien, ce genre de requête exclut l'utilisation des index
> mais à partir de combien d'enregistrement est-ce vraiment pénalisant ?

Bonjour,

Ce type de requête n'exclut pas du tout l'utilisation des index. Quand il


y
a un index sur la colonne, il sera utilisé (s'il est suffisamment
sélectif). Ce que je veux dire est qu'en général on fait ce type de sql
générique pour permettre de faire des recherche sur toutes les colonnes.


Il
est bien plus difficile d'optimiser sa base si tu ne sais pas quelles sont
les requêtes qui vont y être envoyées. Quand tu ne maîtrise pas le code
envoyé au serveur, tu peux t'attendre à des problèmes de performances,
notamment sur les colonnes non indexées.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/