2014-04-28 56 views
1

當返回記錄我有以下程序SQL Server將返回任何結果,但明確設置

CREATE PROCEDURE [dbo].[Q2_05] (@Ch1 nvarchar, @Ch4 nvarchar, @globalOptionCode nvarchar) 

AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT [2_05].Ch1, [2_05].Ch4, [2_05].GlobalOption, [2_05].Part, [2_05].[Key] 
    FROM [dbo.NV300Autostructure].[2_05] 
    WHERE ((([2_05].Ch1)[email protected]) AND (([2_05].Ch4)[email protected]) AND (([2_05].GlobalOption)[email protected])); 
END 

問題,當我用下面的參數(「5」,「日」執行它「」)它不返回任何結果,但在消除過程中,我發現修改的條件線和設置[2_05] .Ch4明確爲‘TH’像這樣:

WHERE ((([2_05].Ch1)[email protected]) AND (([2_05].Ch4)='TH') AND (([2_05].GlobalOption)[email protected])); 

它返回的行數據庫。爲什麼會發生?

+2

可能值得一讀:[壞習慣踢:聲明VARCHAR沒有(長度)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick- declaring-varchar-without-length.aspx) – GarethD

+0

@GarethD如果我不確定參數將使用多長時間(在這種情況下,它可能爲1到3個字符長),我仍然可以使用這種類型的查詢嗎? – kacpr

+1

如果你不知道使用最大可能的時間,如果你不知道這個,只需使用'NVARCHAR(MAX)'。 – GarethD

回答

3

您沒有指定nvarchar參數的尺寸。默認值是1個字符。

所以當您使用參數時,程序正在測試[2_05].Ch4)='T'

+0

我不知道這是必要的。如何在SQL SMS中執行此操作(右鍵單擊過程 - >執行)? 此外,我使用Java來訪問這個數據庫,並使用可調用語句調用過程,例如: {調用dbo.Q2_05(?,?,?)} 並傳遞變量,有沒有一種方法可以使用調用它們的相同方法? – kacpr

+2

當您調用存儲過程時,不需要更改任何內容。你需要更新程序本身。 'create procedure xx @Param nvarchar(** 50 **)....' –

+0

@kacpr您應該在存儲過程中聲明參數的大小,與您正在比較的列('[2_05])相同。 Ch4')。 –