2010-11-13 12 views
0

J'ai ce problème étrange avec un de mes SP. J'ai un SP et l'un des paramètres est de type nvarchar. et je déclare le paramètre, j'inclus la valeur aussi, mais quand je cours il n'y a aucune donnée retournée. court exemple:sql procédure stockée paramètre problème

@BookName nvarchar = null 

Puis dans la clause where je:

AND (o.BookName = @BookName OR @BookName IS NULL) 

Aucune donnée est renvoyée.

Mais quand je fais:

AND (o.BookName = 'SQL Book' OR @BookName IS NULL) 

Je reçois les résultats appropriés. Juste pour vous faire savoir que le champ n'est pas FK.

Des idées quelle peut être la raison? Merci

MISE À JOUR: SP CONTENU:

ALTER PROCEDURE [dbo].[AdvancedSearch] 
(
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null,  
    @BookName nvarchar = null 
    ) 
    AS 
    BEGIN 
    SET NOCOUNT ON 

    SELECT DISTINCT o.OrderID, o.OrderTotal FROM Nop_Order o  
    WHERE (o.CreatedOn > @StartTime OR @StartTime IS NULL) 
    AND (o.CreatedOn < @EndTime OR @EndTime IS NULL) 
    AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL) 
    AND (o.BookName = @BookName OR @BookName IS NULL) 
    ORDER BY o.OrderID 

    END 
+0

Comment s'appelle le SP? – Oded

+0

Généralement, une bonne idée de mentionner quelle base de données vous utilisez. NVARCHAR et la syntaxe me font penser que c'est Microsoft SQL Server, mais vous devriez être spécifique. –

+0

Pourriez-vous montrer la requête complète? –

Répondre

1

Remplacer cette ligne

@BookName nvarchar = null 

avec

@BookName nvarchar(100) = null 

J'espère que cela résoudra votre problème.

0

meilleur pari est que vous passez pas vraiment le paramètre dans la procédure à partir de votre code côté client. Assurez-vous de cela. Vous pouvez également tester la procédure entièrement du côté SQL en l'exécutant ("EXEC myProcedure ('SQL Book')") pour voir si vous obtenez la bonne réponse de cette façon; alors vous saurez que c'est un problème de communication.

+0

Je fais cela aussi, chaque fois que j'inclurai le paramètre book, je n'obtiens pas de données – Laziale

0

Si vous appelez de .NET puis essayez

Dim param as New SqlParameter("@BookName", SqlDbType.NVarChar, 8) 

Ou DBType.String

Après avoir publié votre mise à jour:

ALTER PROCEDURE [dbo].[AdvancedSearch] 
( 
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null,  
    @BookName nvarchar = null 
    ) 
    AS 
    BEGIN 
    SET NOCOUNT ON 

    SELECT DISTINCT o.OrderID, o.OrderTotal FROM Nop_Order o  
    WHERE (o.CreatedOn > @StartTime OR @StartTime IS NULL) 
    AND (o.CreatedOn < @EndTime OR @EndTime IS NULL) 
    AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL) 
    AND (o.BookName = COALESCE(@BookName, BookName)) 
    ORDER BY o.OrderID 

    END 
+0

if (! BookName.Equals (string.Empty)) { CommAdvanced.Parameters.Add ("@ BookName", SqlDbType. NVarChar) .Value = bookName; } sinon { commAdvanced.Parameters.Add ("@ BookName", SqlDbType.NVarChar) .Value = DBNull.Value; } – Laziale

+0

voilà comment j'essaie, je suis désolé, je ne sais pas comment mettre le texte dans un bloc de code – Laziale

1

Dans la définition de votre procédure stockée, vous ne donnons aucune longueur à votre paramètre @BookName - Je pense que SQL Server utilisera par défaut 1 seul caractère dans ce cas:

ALTER PROCEDURE [dbo].[AdvancedSearch] 
(
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null,  
    @BookName nvarchar = null ** no length given!! 
) 

Essayez de changer cela à une longueur appropriée, par ex. NVARCHAR(100) ou quelque chose

ALTER PROCEDURE [dbo].[AdvancedSearch] 
(
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null,  
    @BookName nvarchar(100) = null ** define a length !! 
) 
+0

Thx homme, c'était le problème :) – Laziale