Sql server 在SQL中使用IsNumeric时,将varchar转换为数值时出现算术溢出错误
当我试图在临时表中插入一个十进制数时,会出现算术溢出错误: 将varchar转换为数据类型numeric时出现算术溢出错误 这是SQL: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
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