2016-02-27 47 views
3

這裏是我的存儲過程:存儲過程不返回任何行,但相同的查詢返回正確的數據

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) 

在執行時不返回任何值,但如果我執行這個查詢:

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) 

它返回完全需要的數據。我完全困惑它爲什麼會發生。完全沒有區別。我確保腳本在同一個數據庫上運行,並且它也包含完美的數據。這裏是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 

一個更奇怪的我已經注意到的是,如果我修改該SP和限制條件,只有日期,而不是名字。它工作得很好。 我正在開發SQL Server的Visual Studio 2013界面。不管理工作室使用varchar()char()和相關類型時(如果這非常重要)

+0

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx(始終將長度分配給變量類型)&http ://blogs.sqlsentry.com/aaronbertrand/bad-habits-attachdbfilename/(爲什麼數據庫名爲'E:\ SANDWICH3 \ ABC \ BIN \ DEBUG \ DATABASE \ ABC.MDF'而不是'ABC'?) –

+0

名稱仍然是ABC,其餘爲目標路徑。正如我所提到的,我使用Visual Studio界面 –

回答

6

在SQL Server中,總是使用長度參數:

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

大多數客戶的名字可能有不止一個字符。

+1

因爲如果你**不**指定一個長度,那麼'@customerName varchar'結果是**正好--1 - 字符**長! –

+0

哦,夥計!你救了我整個晚上。謝謝十億。這是多麼愚蠢的錯誤。感謝上帝,我沒有浪費我的更多時間,並在這裏問。我已經浪費了幾個小時弄清楚了。謝謝@Gordon Linof –

相關問題