Recherche sur champ calculé [SQL server] - SQL/NoSQL - Programmation
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" )
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]
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
Marsh Posté le 10-07-2008 à 11:09:11
Y'a quand même un truc étrange :
Code :
|
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.
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'
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 :
|
(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
Marsh Posté le 10-07-2008 à 11:26:53
Code :
|
|
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 )
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 ?
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
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.
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.
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
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