[SQL server] Recherche sur champ calculé

Recherche sur champ calculé [SQL server] - SQL/NoSQL - Programmation

Marsh Posté le 09-07-2008 à 17:49:30    

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

Reply

Marsh Posté le 09-07-2008 à 17:49:30   

Reply

Marsh Posté le 09-07-2008 à 18:53:07    

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
Reply

Marsh Posté le 10-07-2008 à 10:59:48    

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]
 

Reply

Marsh Posté le 10-07-2008 à 11:02:09    

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

Reply

Marsh Posté le 10-07-2008 à 11:09:11    

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.

Reply

Marsh Posté le 10-07-2008 à 11:12:47    

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'

Reply

Marsh Posté le 10-07-2008 à 11:21:29    

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
Reply

Marsh Posté le 10-07-2008 à 11:26:53    

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
Reply

Marsh Posté le 10-07-2008 à 11:32:46    

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 ?

Reply

Marsh Posté le 10-07-2008 à 11:47:31    

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
Reply

Marsh Posté le 10-07-2008 à 11:47:31   

Reply

Marsh Posté le 10-07-2008 à 11:49:42    

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.

Reply

Marsh Posté le 10-07-2008 à 12:01:26    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed