2011-02-26 99 views
0

我在SQL Server中有一個奇怪的例子。這種情況如下: 我有3列的表格:存儲過程中的BETWEEN語句

ID value1 value2 
60FB 14.54 46.05 
7066 12.18 41.23 
7072 16.18 46.65 
710F 12.17 47.65 
7126 13.18 49.65 
713E 17.18 48.65 
7141 12.19 41.33 
7144 12.18 47.65 
7147 19.18 49.65 
7149 18.18 42.65 
71A6 17.18 43.65 
71AA 14.54 44.05 

ID是char,數值1的小數,值2是小數。

如果我在SQL Server中的select語句:

SELECT ID, value1, value2 
FROM   Node 
where value1 between 12.1 and 12.2 
and value2 between 41.2 and 41.5 

我得到這樣的結果是我想擁有的一切:

ID value1 value2 
7066 12.18 41.23 
7141 12.19 41.33 

現在我要傳遞的參數代入間存儲過程看起來像這樣:

create procedure XYZ 

@value1min decimal(2,5), 
@value2min decimal(2,5), 
@value1max decimal(2,5), 
@value2max decimal(2,5) 

AS 
BEGIN 

SELECT ID, value1, value2 
FROM   Node 
where value1 between @value1min and @value1max 
and value2 between @value2min and @value2max 

當我運行具有相同參數的過程我得到錯誤的結果是:

ID value1 value2 
7066 12.18 41.23 
710F 12.17 47.65 
7141 12.19 41.33 
7144 12.18 47.65 

我認爲,問題是在所有值都滿足的條件值1,但兩人都沒有履行值2的條件範圍,所以我不知道爲什麼710F和7144出現在結果中。

有沒有人有任何答案如何解決這個問題?

謝謝, 馬克

+2

存儲的proc調用看起來像什麼?什麼是列數據類型? – gbn 2011-02-26 09:02:30

+2

參數順序可疑,值1和值2是混合的。你確定你以正確的順序傳遞參數嗎? – Andomar 2011-02-26 09:03:28

+1

實際上,*不是*您的存儲過程,因爲小數(2,5)失敗。那麼我們如何幫助您排除故障? -1 – gbn 2011-02-26 09:14:01

回答

1

這是一個多回答一個擴展註釋:

請在上帝的份上不簡化的問題,以至於

  1. 問題了
  2. 的PROC是甚至沒有有效的語法

樣本表

create table node (ID char(4), value1 decimal(10,4), value2 decimal(10,4)) 
insert node select 
'60FB' ,14.54 , 46.05 union all select 
'7066' ,12.18 , 41.23 union all select 
'7072' ,16.18 , 46.65 union all select 
'710F' ,12.17 , 47.65 union all select 
'7126' ,13.18 , 49.65 union all select 
'713E' ,17.18 , 48.65 union all select 
'7141' ,12.19 , 41.33 union all select 
'7144' ,12.18 , 47.65 union all select 
'7147' ,19.18 , 49.65 union all select 
'7149' ,18.18 , 42.65 union all select 
'71A6' ,17.18 , 43.65 union all select 
'71AA' ,14.54 , 44.05 
GO 

樣品PROC

​​

的選擇使用固定值,後面兩個高層。需要注意的是,第二和第三PARAMS被交換

select * from node 
where value1 between 12.1 and 12.2 
and value2 between 41.2 and 41.5 
; 
exec xyz 12.1, 12.2, 41.2, 41.5 
; 
exec xyz 12.1, 41.2, 12.2, 41.5 

每一個情況下,輸出是

ID  value1 value2 
7066 12.1800 41.2300 
7141 12.1900 41.3300 

  • --- << --- note here如果更改參數去decimal(2,5),你得到Msg 192, Level 15, State 1, Procedure testme, Line 1. The scale must be less than or equal to the precision.
  • 如果您將其更改爲(7,5),則沒有區別;符合(5,2)的數字將符合(7,5)。

那麼問題又出在哪裏?

如果我想要根本猜不出,那就是你將錯誤的參數傳遞給EXEC。

+0

現在嘗試使用這個參數:@ value1min = 12.1,@ value1max = 12.2,@ value2min = 41.2,@ value2max = 47.75並且用SP和查詢本身來完成。 – Mark 2011-02-26 11:08:52

+0

@Mark:那麼儘管存儲過程中斷,它仍能正常工作 – gbn 2011-02-26 11:20:33

+0

@gbn,@Richard aka syberkiwi:現在正在工作。這是我的表中錯誤的小數設置,表中我的設置​​更加細化(例如:3,5),但在SP中它們是2.5。 – Mark 2011-02-26 11:33:29

1

你有你的DECIMAL定義混合起來:

decimal(2,5) 

這意味着:我想DECIMAL,具有共有2位,其小數點後分隔器。

什麼你大概的意思定義是:

decimal(7,5) 

DECIMAL共有7位,5小數點分隔符後,其(與前兩話)。

表中的列是什麼類型?

MSDN documentation for DECIMAL

十進制[(對[,S])]

固定精度和比例的數字。當使用最大精度,有效 值從 - 10^38 1到10^38 - 1

P(精度)

的十進制數字的最大總數,可以是存儲, 小數點的左邊和右邊 。精度必須 是通過最大 精度38.從值1的默認精度 是18.

S(刻度)

的十進制數字,可以被存儲到所述最大數目小數點的右邊 。比例必須是從0到p的 值。只有在指定精度爲 時,纔可以指定規模爲 。默認比例是0; 因此,0 < = s < = p。根據 的精確度,最大 的存儲尺寸會有所不同。

+0

它不會創建帶有十進制(2,5)的存儲過程。好電話 – gbn 2011-02-26 09:12:48

+0

-1別無選擇。這個陳述「我得到錯誤的結果」指出這個參數在問題中是錯誤的,而不是在IRL中。它沒有說 - SP不工作 – RichardTheKiwi 2011-02-26 10:09:56

+0

@marc_s - 不,它不會。 'create proc testme @d decimal(2,5)as select @d '=>'Msg 192,Level 15,State 1,Procedure testme,Line 1.該比例必須小於或等於精度。答案**是**看錯了地方,-1停留 – RichardTheKiwi 2011-02-26 10:29:58