2016-02-27 1 views
3

Voici ma procédure stockée:procédure stockée ne retourne pas de ligne, mais même requête renvoie les données appropriées

CREATE PROC [SPmainReport] 
@startDate date = null, 
@endDate date = null, 
@customerName varchar = null, 

AS 
SELECT Distinct 
    VI.Code as CustomerCode, VI.Name as CustomerName, VI.Area as CustomerArea, VI.[Address] as [address], CP.ProductName as ProductName, CP.ProductQuantity as Quantity 
from 
VendorTrading VT inner join CustomerProducts CP on VT.Id = CP.VendorTradingId inner join VendorInfo VI on VT.VendorId = VI.Id 
where 
(VT.Tradedate between isnull(@startDate,VT.Tradedate) and isnull(@endDate,VT.Tradedate)) 
and VI.Name = ISNULL(@customerName, VI.Name) 

Lors de l'exécution, il ne retourne pas une valeur, mais si j'exécuter cette requête:

SELECT Distinct 
    VI.Code as CustomerCode, VI.Name as CustomerName, VI.Area as CustomerArea, VI.[Address] as [address], CP.ProductName as ProductName, CP.ProductQuantity as Quantity 
from 
VendorTrading VT inner join CustomerProducts CP on VT.Id = CP.VendorTradingId inner join VendorInfo VI on VT.VendorId = VI.Id 
where 
(VT.Tradedate between isnull(@startDate,VT.Tradedate) and isnull(@endDate,VT.Tradedate)) 
and VI.Name = ISNULL('John', VI.Name) 

Renvoie exactement les données requises. Je suis totalement confus pourquoi cela se produit. Il n'y a pas de différence du tout. Je m'assure que les scripts fonctionnent sur la même base de données et contient également des données parfaites. voici script d'exécution SP:

USE [E:\SANDWICH3\ABC\BIN\DEBUG\DATABASE\ABC.MDF] 
GO 

DECLARE @return_value Int 

EXEC @return_value = [dbo].[SPmainReport] 
    @startDate = '2015-12-25', 
    @endDate = '2015-12-25', 
    @customerName = N'John' 

SELECT @return_value as 'Return Value' 

GO 

Un plus étrange, je l'ai remarqué est que si je modifie ces conditions de SP et limite avec des dates seulement, pas le nom. Cela fonctionne bien alors. Je travaille sur l'interface Visual Studio 2013 du serveur SQL. Non studio de gestion (Dans le cas où il fait la matière)

+0

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx (toujours affecter des longueurs aux types de variables) & http : //blogs.sqlsentry.com/aaronbertrand/bad-habits-attachdbfilename/ (pourquoi votre base de données est-elle nommée 'E: \ SANDWICH3 \ ​​ABC \ BIN \ DEBUG \ DATABASE \ ABC.MDF' au lieu de simplement' ABC'?) –

+0

Le nom est toujours ABC, le reste est le chemin de destination. Comme je l'ai mentionné, j'utilise Visual Studio Interface –

Répondre

6

Dans SQL Server, toujours utiliser un paramètre de longueur lors de l'utilisation varchar() et char() et types connexes:

CREATE PROCEDURE SPmainReport (
    @startDate date = null, 
    @endDate date = null, 
    @customerName varchar(255) = null 
) 
BEGIN 
    . . . 
END; 

La plupart des noms de clients ont probablement plus d'un caractère .

+1

Parce que si vous ** ne spécifiez pas une longueur, alors @customerName varchar' finit par être ** exactement --1-- caractère ** long! –

+0

Oh mec! Tu as sauvé toute ma nuit. Merci un milliard. Quelle erreur stupide c'était. Dieu merci, je n'ai pas perdu mes heures supplémentaires et demandé ici. J'ai déjà perdu quelques heures à le comprendre. Merci beaucoup @Gordon Linof –