Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2667 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL server] Recherche sur champ calculé

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL server] Recherche sur champ calculé

n°1757485
HiATuZ
Posté le 09-07-2008 à 17:49:30  profilanswer
 

Bonjour à tous !
 
Voilà maintenant un bon moment que je travaille dans le merveilleux univers LAMP et me voilà confronté aujourd'hui à un sombre sql server ^_^
Et là les problèmes commencent lol. Je ne remets pas du tout en question la machine mais bien évidement mes compétences en la matière et c'est pour cela que j'expose mon souci aujourd'hui.
 
Plus précisement voici ce que je veux faire :
J'ai un table Clients, avec plusieurs champs (email, nom, prénom etc...) et un champ de type calculé (que l'on nommera 'calculated').
Ce champ calculated peut prendre 4 valeurs : 0 - 1 - 2 - 3 - 4
 
J'aimerai donc faire une requete de Select pour tous les clients ayant pour calculated : 1 et bien évidement un truc du genre :
 
Select * from clients where calculated=1
 
ne fonctionne pas...
 
J'ai eu beau checker les docs etc... mais impossible de m'y retrouver.
Pouvez-vous m'aider svp ?
 
Many thx

mood
Publicité
Posté le 09-07-2008 à 17:49:30  profilanswer
 

n°1757499
MagicBuzz
Posté le 09-07-2008 à 18:53:07  profilanswer
 

tu peux générer le script de création de ta table et la poster ici ?
 
parce que ta requête est parfaitement valide et devrait donner le bon résultat d'après les informations que tu nous donnes...
 
(dans SQL Server Manager, click droit sur la table, "générer script", "create" )


Message édité par MagicBuzz le 09-07-2008 à 18:53:52
n°1757738
HiATuZ
Posté le 10-07-2008 à 10:59:48  profilanswer
 

Bonjour et merci de vous penchez sur mon pb =)
Le voici (simplifié)
 
USE [maBase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Clients](
 [Id_Client] [int] IDENTITY(1,1) NOT NULL,
 [Id_univers] [smallint] NOT NULL,
 [Optin]  AS ([dbo].[GetOptin]('NLList',[Id_Client],[Id_Univers])),
 [email] [nvarchar](100) NULL,
 [NLList]  AS ([dbo].[GetList]('NLList',[Id_Client])),
 CONSTRAINT [PK_Clients_1] PRIMARY KEY CLUSTERED  
(
 [Id_Client] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 

n°1757743
MagicBuzz
Posté le 10-07-2008 à 11:02:09  profilanswer
 

Et tu peux aussi me fournir les fonction GetOptin et GetList ?
Histoire que je puisse créer la table pour tester ;)

n°1757752
MagicBuzz
Posté le 10-07-2008 à 11:09:11  profilanswer
 

Y'a quand même un truc étrange :

Code :
  1. CREATE FUNCTION GetOptin(@var1 AS varchar(10), @var2 AS int, @var3 AS smallint)
  2. returns int
  3. AS
  4. begin
  5.     RETURN @var2 + @var3;
  6. end
  7. go
  8.  
  9. CREATE FUNCTION GetList(@var1 AS varchar(10), @var2 AS int)
  10. returns smallint
  11. AS
  12. begin
  13.     RETURN @var2 * 2;
  14. end
  15. go
  16.  
  17. CREATE TABLE [Clients](
  18. [Id_Client] [int] IDENTITY(1,1) NOT NULL,
  19. [Id_univers] [smallint] NOT NULL,
  20. Optin  AS (dbo.GetOptin('NLList',Id_Client,Id_Univers)),
  21. [email] [nvarchar](100) NULL,
  22. [NLList]  AS (dbo.[GetList]('NLList',[Id_Client])),
  23. CONSTRAINT [PK_Clients_1] PRIMARY KEY CLUSTERED  
  24. (
  25. [Id_Client] ASC
  26. )
  27. ) ON [PRIMARY]
  28. go
  29.  
  30. INSERT INTO clients(id_univers, email) VALUES (1, 'toto@plop.com');
  31. INSERT INTO clients(id_univers, email) VALUES (1, 'toto@plop.com');
  32. INSERT INTO clients(id_univers, email) VALUES (2, 'toto@plop.com');
  33. INSERT INTO clients(id_univers, email) VALUES (2, 'toto@plop.com');
  34.  
  35. SELECT *
  36. FROM clients
  37. WHERE nllist = 4;


 
Ca marche très bien sur ma base (SQL Server 2005 Express)
C'est quoi le type retourné par tes fonctions ? Notamment celui que tu utilise dans ton where.

n°1757757
HiATuZ
Posté le 10-07-2008 à 11:12:47  profilanswer
 

en faisant la même manip' sur les fonction j'ai quelque chose de bien maigre... :
CREATE FUNCTION [dbo].[GetOptin](@fieldname [nvarchar](100), @idClient [int], @univers [int])
RETURNS [int] WITH EXECUTE AS CALLER
AS  
EXTERNAL NAME [SLO].[UserDefinedFunctions].[GetOptin]
 
 
//------------------------------------
CREATE FUNCTION [dbo].[GetList](@tableName [nvarchar](4000), @idClient [int])
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS  
EXTERNAL NAME [SLO].[UserDefinedFunctions].[GetList]
GO
EXEC sys.sp_addextendedproperty @name=N'AutoDeployed', @value=N'yes' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'GetList'
GO
EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFile', @value=N'Function1.cs' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'GetList'
GO
EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFileLine', @value=24 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'GetList'

n°1757768
MagicBuzz
Posté le 10-07-2008 à 11:21:29  profilanswer
 

Ok. Pigé je pense.
 
Ton "NLList", c'est un VARCHAR, pas un entier.
Et apparement, il ne contient pas "4", mais autrechose (en SQL le cast varchar vers int est implicite et donc ne poserait pas de problème).
 
Mais vu que c'est un varchar(4000), et vu son nom, je suis tenté de croire qu'il ne contient pas "4", mais par exemple "1 - 2 - 3 - 4" sous forme de chaîne de caractère non ?
 
Si c'est bien une liste genre "1, 2, 3, 4", alors tu peux faire ceci :
 

Code :
  1. SELECT * FROM clients WHERE ' - ' + NLList + ' - ' LIKE '% - 4 - %'


 
(on transforme "1 - 2 - 3 - 4" en " - 1 - 2 - 3 - 4 - " afin de retrouver exactement " - 4 - " ce qui évite un "where NLList like '%4%' qui sera true aussi si la liste contient par exemple "14" )
 
Et là ça va aller beaucoup mieux ;)


Message édité par MagicBuzz le 10-07-2008 à 11:25:32
n°1757774
MagicBuzz
Posté le 10-07-2008 à 11:26:53  profilanswer
 

Code :
  1. DROP TABLE clients;
  2. DROP FUNCTION getoptin;
  3. DROP FUNCTION getlist;
  4. go
  5.  
  6. CREATE FUNCTION GetOptin(@var1 AS varchar(10), @var2 AS int, @var3 AS smallint)
  7. returns int
  8. AS
  9. begin
  10.     RETURN @var2 + @var3;
  11. end
  12. go
  13.  
  14. CREATE FUNCTION GetList(@var1 AS varchar(10), @var2 AS int)
  15. returns varchar(20)
  16. AS
  17. begin
  18.     RETURN '1 - 2 - 3 - ' + cast(@var2 AS varchar);
  19. end
  20. go
  21.  
  22. CREATE TABLE [Clients](
  23. [Id_Client] [int] IDENTITY(1,1) NOT NULL,
  24. [Id_univers] [smallint] NOT NULL,
  25. Optin  AS (dbo.GetOptin('NLList',Id_Client,Id_Univers)),
  26. [email] [nvarchar](15) NULL,
  27. [NLList]  AS (dbo.[GetList]('NLList',[Id_Client])),
  28. CONSTRAINT [PK_Clients_1] PRIMARY KEY CLUSTERED  
  29. (
  30. [Id_Client] ASC
  31. )
  32. ) ON [PRIMARY]
  33.  
  34. INSERT INTO clients(id_univers, email) VALUES (1, 'toto@plop.com');
  35. INSERT INTO clients(id_univers, email) VALUES (1, 'toto@plop.com');
  36. INSERT INTO clients(id_univers, email) VALUES (2, 'toto@plop.com');
  37. INSERT INTO clients(id_univers, email) VALUES (2, 'toto@plop.com');
  38.  
  39. SELECT * FROM clients;
  40.  
  41. SELECT *
  42. FROM clients
  43. WHERE ' - ' + nllist + ' - ' LIKE '% - 4 - %'


 


(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
Id_Client   Id_univers Optin       email           NLList
----------- ---------- ----------- --------------- --------------------
1           1          2           toto@plop.com   1 - 2 - 3 - 1
2           1          3           toto@plop.com   1 - 2 - 3 - 2
3           2          5           toto@plop.com   1 - 2 - 3 - 3
4           2          6           toto@plop.com   1 - 2 - 3 - 4
 
(4 ligne(s) affectée(s))
 
Id_Client   Id_univers Optin       email           NLList
----------- ---------- ----------- --------------- --------------------
4           2          6           toto@plop.com   1 - 2 - 3 - 4
 
(1 ligne(s) affectée(s))


Message édité par MagicBuzz le 10-07-2008 à 11:28:34
n°1757778
HiATuZ
Posté le 10-07-2008 à 11:32:46  profilanswer
 

oui c'est tout à fait cela, en fait mon premier post était surtout un exemple générique qui aurait pu être appliqué a mon cas (je ne pensais pas que qq s'y pencherait autant :D)
Donc oui ce champ contient exactement une liste ;)
mais j'ai toujours la même erreur a savoir ".net sqlClient data provider" avec un message d'erreur vide ...
et ceci pour l'execution de :  
SELECT     Id_Client
FROM         Clients
WHERE     (NLList LIKE '%35%') (après avoir essayé ta methode ;))
 
Mais une autre piste pourrait être à suivre également. Cette table contient 850 000 lignes environs et contient beaucoup d'informations. Problème d'indexation ?

n°1757792
MagicBuzz
Posté le 10-07-2008 à 11:47:31  profilanswer
 

ah oui mais là c'est plus un soucis de résultat, mais d'installation du serveur :o
 
tu dois allez dans l'assistant d'exposition et activer les procédures stockées écrites en .NET
 
par contre, je peux pas t'en dire plus, parceque tu bosse visiblement avec un partenaria de serveur (ou d'une base à une autre) et en appelant des PS écrites en .NET, choses que je n'ai jamais fais en simultané (et que j'ai SQL Server Express, donc je ne sais pas comment se comporte la version entreprise)
 
mais tu dois aussi surtout vérifier que ton partenaria fonctionne, et que ta PS écrite en .NET, si elle fait des accès à une base distante, a bien toutes les informations pour se connecter.


Message édité par MagicBuzz le 10-07-2008 à 11:48:24
mood
Publicité
Posté le 10-07-2008 à 11:47:31  profilanswer
 

n°1757796
MagicBuzz
Posté le 10-07-2008 à 11:49:42  profilanswer
 

Non, c'est pas un souci d'index, c'est un souci de connexion à une base d'après l'erreur, ou éventuellement de coopération entre .NET et SQL Server.
 
Pour moi faut que tu vérifies le partenariat avec la base "SLO" et que t'as bien activé les PS .NET sur ton serveur.

n°1757811
HiATuZ
Posté le 10-07-2008 à 12:01:26  profilanswer
 

Alright bah merci pour toutes ces informations.
C'est exactement ce que tu relèves, en revanche j'interviens sur le serveur aujourd'hui mais je n'en ai pas du tout suivi la mise en place :/
 
J'escalade cette piste ;) Merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL server] Recherche sur champ calculé

 

Sujets relatifs
[Résolu] SQL liste meilleur score pour 1 joueur[SQL] problème requête
Avoir le curseur dans un champ de formulaireMacro Excel de recherche + concaténation
Recherche personne dans l'oiseSQL Server - BULK INSERT sur un fichier csv avec guillemets
recherche aideRecherche de caractère dans un nom de fichier
Select sur un champ mémo d'une base access97 
Plus de sujets relatifs à : [SQL server] Recherche sur champ calculé


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR