2013-11-25 25 views
0

使用時,當我有一個查詢,如四捨五入VARCHAR:SQL的功能

SELECT top 1 LabResult_Result as Value 
FROM [TopsData].[dbo].[VIEW_PatientLabResult] 
where MasterLabCode_ID = '000000003H' 
    and Patient_ID = 'ZZZZZ00063' 
    and LabResult_RecordState = 0 
    and datediff(d,'11/19/2013',LabResult_DateTimeOfObservation) >= 0 
ORDER BY LabResult_DateTimeOfObservation 

的結果是好的,通常是一個類似於一個decimale如1.10

但是,如果我換VARCHAR這一個功能,它返回只是一個1

declare @R varchar(10) 

SELECT @R = Value FROM (
    SELECT top 1 LabResult_Result as Value 
    FROM [TopsData].[dbo].[VIEW_PatientLabResult] 
    where MasterLabCode_ID = '000000003H' 
     and Patient_ID = 'ZZZZZ00063' 
     and LabResult_RecordState = 0 
     and datediff(d,'11/19/2013',LabResult_DateTimeOfObservation) >= 0 
    ORDER BY LabResult_DateTimeOfObservation 
    )q 


return @R 
END 

很顯然,我有計劃讓通用與參數,等等。但是,如果硬編碼的查詢不會返回正確的varchar,我不知道該怎麼做。

+1

你是什麼LabResult_Result列的實際數據類型? – Andrew

+0

從源表︰varchar(250) – ajspacemanspiff

+0

關閉我的頭頂,我不知道是什麼會導致你正在報告的行爲。但是,如果你想要一個小數,然後把它作爲小數存儲!另外,我沒有看到你的proc需要,它沒有做任何簡單的查詢無法做的事情。 – Andrew

回答

3

我敢打賭,你的函數說:

RETURNS VARCHAR 

或者:

@input VARCHAR 

相反的:

RETURNS VARCHAR(10) 

或者:

@input VARCHAR(10) 

全REPRO ...這兩個函數調用的返回a

USE tempdb; 
GO 

CREATE FUNCTION dbo.foo1 
(
    @a VARCHAR(10) 
) 
RETURNS VARCHAR 
----- LAZY! ---^^^^ Missing length specification! 
AS 
BEGIN 
    RETURN @a; 
END 
GO 

SELECT dbo.foo1('abcdefghij'); 
GO 

CREATE FUNCTION dbo.foo2 
(
    @a VARCHAR 
    ---- LAZY! ^^^^ Missing length specification 
) 
RETURNS VARCHAR(10) 
AS 
BEGIN 
    RETURN @a; 
END 
GO 

SELECT dbo.foo2('abcdefghij'); 
GO 

DROP FUNCTION dbo.foo1, dbo.foo2; 
GO 

總是,總是,聲明或在任何情況下限定出可變寬度類型時始終指定的長度。在某些情況下,SQL Server會假定你的意思是1,在某些情況下是30,在極少數情況下,猜測是正確的。這裏更多的信息:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx