Sql server SQL在函数中使用时取整varchar

Sql server SQL在函数中使用时取整varchar,sql-server,function,Sql Server,Function,当我遇到以下问题时: 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_DateTimeOfOb

当我遇到以下问题时:

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
结果很好,通常是一个类似于十进制的varchar,如
1.10

但是,如果我将其包装到函数中,它只返回一个
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,我不知道该怎么办。

我打赌您的函数会说:

RETURNS VARCHAR
或:

而不是:

RETURNS VARCHAR(10)
或:

完全谴责。。。这两个函数调用都返回
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,在极少数情况下是猜测正确的。更多信息请点击此处:


我打赌你的函数会说:

RETURNS VARCHAR
或:

而不是:

RETURNS VARCHAR(10)
或:

完全谴责。。。这两个函数调用都返回
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,在极少数情况下是猜测正确的。更多信息请点击此处:


我打赌你的函数会说:

RETURNS VARCHAR
或:

而不是:

RETURNS VARCHAR(10)
或:

完全谴责。。。这两个函数调用都返回
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,在极少数情况下是猜测正确的。更多信息请点击此处:


我打赌你的函数会说:

RETURNS VARCHAR
或:

而不是:

RETURNS VARCHAR(10)
或:

完全谴责。。。这两个函数调用都返回
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,在极少数情况下是猜测正确的。更多信息请点击此处:



您的LabResult\u结果列的实际数据类型是什么?从源表:我头顶上的varchar(250),我不知道是什么导致了您报告的行为。但是,如果需要小数,请将其存储为小数!另外,我不认为你的程序有任何必要,它没有做任何简单查询不能做的事情。我不能存储小数,许多结果不是小数。我希望varchar原封不动地返回。这只是更复杂查询中的一个步骤,因为proc肯定是首选。您能发布函数的完整代码吗?标题中可能缺少影响结果的内容。LabResult\u Result列的实际数据类型是什么?从源表:我头顶上的varchar(250),我不知道是什么导致了您报告的行为。但是,如果需要小数,请将其存储为小数!另外,我不认为你的程序有任何必要,它没有做任何简单查询不能做的事情。我不能存储小数,许多结果不是小数。我希望varchar原封不动地返回。这只是更复杂查询中的一个步骤,因为proc肯定是首选。您能发布函数的完整代码吗?标题中可能缺少影响结果的内容。LabResult\u Result列的实际数据类型是什么?从源表:我头顶上的varchar(250),我不知道是什么导致了您报告的行为。但是,如果需要小数,请将其存储为小数!另外,我不认为你的程序有任何必要,它没有做任何简单查询不能做的事情。我不能存储小数,许多结果不是小数。我希望varchar原封不动地返回。这只是更复杂查询中的一个步骤,因为proc肯定是首选。您能发布函数的完整代码吗?标题中可能缺少影响结果的内容。LabResult\u Result列的实际数据类型是什么?从源表:我头顶上的varchar(250),我不知道是什么导致了您报告的行为。但是,如果需要小数,请将其存储为小数!另外,我不认为你的程序有任何必要,它没有做任何简单查询不能做的事情。我不能存储小数,许多结果不是小数。我希望varchar原封不动地返回。这只是更复杂查询中的一个步骤,因为proc肯定是首选。您能发布函数的完整代码吗?标题中可能缺少影响结果的内容。