Sql server 在SQL中使用IsNumeric时,将varchar转换为数值时出现算术溢出错误

Sql server 在SQL中使用IsNumeric时,将varchar转换为数值时出现算术溢出错误,sql-server,Sql Server,当我试图在临时表中插入一个十进制数时,会出现算术溢出错误: 将varchar转换为数据类型numeric时出现算术溢出错误 这是SQL: CREATE TABLE #ObDiabetesEncounterIDs ( PatientEncounterID int, Value decimal(5,2) ) INSERT INTO #ObDiabetesEncounterIDs(PatientEncounterID, Value) SELECT PatientEnco

当我试图在临时表中插入一个十进制数时,会出现算术溢出错误:

将varchar转换为数据类型numeric时出现算术溢出错误

这是SQL:

CREATE TABLE #ObDiabetesEncounterIDs
(
     PatientEncounterID int, 
     Value decimal(5,2)
)

INSERT INTO #ObDiabetesEncounterIDs(PatientEncounterID, Value)
    SELECT PatientEncounterID, Value 
    FROM Observation 
    WHERE Term = 'HGBA1C' 
      AND ISNUMERIC(Value) = 1 
      AND Value IS NOT NULL 
      AND PatientEncounterID IS NOT NULL;
大多数十进制值在5.1到15.1之间。有一些值是整数,如15和10。有两个超出该范围,例如1405和151。我想我通过使用数据类型
decimal(5,2)
来适应这些值

我哪里做错了

更新 更新小数点的精度有帮助。这就创造了1403年的记录。但也有一条记录使用逗号而不是句点。 所以,这个值是9,7。
因此,我认为我需要检查ISNUMERIC,然后将任何逗号更改为句点,然后转换为十进制。

您的类型是错误的<代码>小数点(5,2)表示小数点右侧的3位数字和左侧的2位数字。尝试将其更改为
decimal(7,2)

因为
Value
是字符数据,请在
SELECT
语句中将其转换为
decimal

CREATE TABLE #ObDiabetesEncounterIDs(PatientEncounterID int, Value decimal(7,2));

INSERT INTO #ObDiabetesEncounterIDs(PatientEncounterID, Value)
SELECT PatientEncounterID, CAST(Value AS DECIMAL(7,2))
  FROM Observation 
  WHERE Term = 'HGBA1C' 
    AND Value IS NOT NULL 
    AND PatientEncounterID IS NOT NULL;
为了测试这一点,我做了以下操作(注意,在下面的示例中,我将源表命名为
MyObservation
,而不是
Observation
,以避免干扰原始表):


上述操作在我的SQL Server 2014系统上完美无瑕。

我收到错误,将数据类型varchar转换为数字时出错。然而,文件中指出,第一个数字是精度,第二个是比例。decimal[(p[,s])]p(精度)将存储的小数点左右的最大总位数。您可能需要修改策略,以便确定哪一行输入数据对临时表不利。一旦你有了这些信息,它可能会帮助你确定确切的问题。另外,源表的数据类型是什么?源表的数据类型是varchar。该列可以保存所有类型的数据。我以为使用
ISNUMERIC()=1
只会返回一个数字。抱歉-没有意识到输入数据类型。我将修改我的答案。
DECIMAL(5,2)
总共有5位数字,其中2位在小数点之后-因此您可以在该类型中存储0.00到999.99之间的值-像
1405
这样的值不能存储在这样的十进制列中!谢谢让我试试。将varchar转换为数据类型numeric时仍然返回溢出错误。我甚至在查询中添加了
ISNUMERIC(Value)=1
,错误仍然存在。IsNumeric()不应该只返回列中的数值,并且可以转换为十进制吗?请至少发布一个观察表的部分架构,显示列
PatientCounterId
Value
?如果你能发布一些示例值,这也是值得的。这个答案会有用的。我的数据的问题是其中一行(9,7)中有一个逗号,数据中有一个逗号和一个句点(6,7)。一旦我更换了它们,它就起作用了。谢谢。上面我已经做了一个完整的例子。您的数据一定有问题。通过此查询查找违规记录:
从[Observation]中选择PatientCounterId、Value、Term,其中NOT(Term='HGBA1C'和ISNUMERIC(Value)=1,Value不为NULL,PatientCounterId不为NULL)
CREATE TABLE [dbo].[MyObservation](
    [PatientEncounterID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](50) NULL,
    [Term] [varchar](50) NULL,
    CONSTRAINT [PK_MyObservation] PRIMARY KEY CLUSTERED (
        [PatientEncounterID] ASC
    )WITH (
        PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
    ) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [dbo].[MyObservation]
    (Value, Term)
    Values ('.01', 'HGBA1C')
        ,('.12', 'HGBA1C')
        ,('1.23', 'HGBA1C')
        ,('12.34', 'HGBA1C')
        ,('123.45', 'HGBA1C')
        ,('1234.56', NULL)
        ,('12345.67', 'HGBA1C')
        ,('non-numeric', 'HGBA1C')
        ,('9.98', 'Not HGBA1C')
        ,('123.4958', 'HGBA1C')

CREATE TABLE #ObDiabetesEncounterIDs(
    PatientEncounterID int, Value decimal(7,2)
);

INSERT INTO #ObDiabetesEncounterIDs(PatientEncounterID, Value)
SELECT PatientEncounterID, CAST(Value AS DECIMAL(7,2))
    FROM [dbo].[MyObservation]
    WHERE Term = 'HGBA1C' 
    AND ISNUMERIC(Value) = 1
    AND Value IS NOT NULL 
    AND PatientEncounterID IS NOT NULL;

SELECT * FROM #ObDiabetesEncounterIDs