2010-12-09 25 views
1

我有一個char(10)列在一個表中的SQL Server 2005數據庫:MAX在炭火列在SQL-服務器

CREATE TABLE [dbo].[RMA](
    [IdRMA] [int] IDENTITY(1,1) NOT NULL, 
    [RMA_Number] [char](10) NULL 
CONSTRAINT [PK_RMA] PRIMARY KEY CLUSTERED 
(
    [IdRMA] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
ALTER TABLE [dbo].[RMA] WITH CHECK ADD CONSTRAINT [CK_UNIQUE_RMA_NUMBER] CHECK (([rma_number] IS NULL OR [dbo].[_CountRmaNumber]([rma_number])<(2))) 
GO 
ALTER TABLE [dbo].[RMA] CHECK CONSTRAINT [CK_UNIQUE_RMA_NUMBER] 

我知道這將是更好地使一個Int - 列,當我想訂購或聚合它。但是我想知道的是,是否仍然保證SELECT MAX(RMA_Number)總是返回SQL-Server中最高的數字? 值f.e.的格式是:RMA0003715。 RMA_Number是一個包含10個字符的連續數字,始終以RMA開頭。

編輯:感謝所有的確認和詹姆斯懷斯曼的建議,檢查正確的格式。我添加了一個約束:

ALTER TABLE [dbo].[RMA] WITH CHECK ADD CONSTRAINT [CK_UNIQUE_RMA_NUMBER] CHECK (([rma_number] IS NULL OR [dbo].[_CountRmaNumber]([rma_number])<(2))) 
ALTER TABLE [dbo].[RMA] CHECK CONSTRAINT [CK_RMA_Number_Format] 

謝謝。

+1

是 - 根據您使用的排序規則,將返回「最高」值.... – 2010-12-09 10:34:20

+1

使用您的檢查約束,您最好使用LIKE檢查來檢查數字部分('LIKE' [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]'`或`'不LIKE'%[^ 0-9] %'`)。 ISNUMERIC對例如`'1d2'`。 – 2010-12-09 11:48:41

回答

1

如果該字段爲總是格式RMAxxxxxxx(RMA其次是7號)的,那麼,MAX總是返回最高的國家之一。

我相信所有可用的排序規則在字段的數字部分都完全相同。

1

MAX(RMA_Number)會按字母順序對數字字段和文本/ char/varchar字段進行排序。

如果你的數據是一個有保證的格式,然後數字部分總是左填充零,那麼你的MAX函數將起作用。

但是,您似乎沒有任何適當的位置來維護此數據需求。雖然你認爲它會一直是格式的,但實際上並沒有什麼能夠防止插入錯誤的值。我建議你在場上加強你的檢查限制來解決這個問題。

0

只要排序規則不影響按提供的列進行排序,答案是肯定的。