2014-11-17 2 views
0

У меня есть таблица, которая имеет триггер, который вызовет определенный SP, который анализирует строку, вызванную триггером.Ошибка преобразования типа данных varchar в float в запуске триггера, который вызывает SP

Вот строки выброшенные триггером

351856040520298,241111; 1G, 141007024755, А, 1437.2453N, 12100.2887E, 3.10,206,0.8,21010000; 2G, 141007024755,10,43.6,14.08 , 00.18,273295019.6

351856040520298,241111; 1R, 141117003059, А, 1420.4629N, 12058.7028E, 0.0,77,0.9,20000006; 2R, 141117003059,11,98.3,12.58,04.10,282098820.9

, поскольку вы можете видеть, что они различаются по длине. Поэтому я переключаю триггер, чтобы вызвать SP, если e длина соответствует.

Вот мой триггер

USE [SMSGPS] 
GO 
/****** Object: Trigger [dbo].[CallSPGPRSIN] Script Date: 11/17/2014 9:43:44 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[CallSPGPRSIN] 
ON [dbo].[GPRSIN] 
AFTER INSERT 
AS BEGIN 
DECLARE @smsgpsmessage varchar(500); 
DECLARE @smslen varchar(10); 
DECLARE @const varchar(10); 
DECLARE @const1 varchar(10); 
DECLARE @const2 varchar(10); 
DECLARE @const3 varchar(10); 
DECLARE @const4 varchar(10); 
DECLARE @const5 varchar(10); 
SET @smsgpsmessage = (SELECT TOP 1 smsmsg FROM GPRSIN order by smsdt desc); 
SET @smslen = (SELECT LEN(@smsgpsmessage)); 
SET @const = '130'; 
SET @const1 = '131'; 
SET @const2 = '132'; 
SET @const3 = '133'; 
SET @const4 = '134'; 
SET @const5 = '135'; 

if @smslen = @const OR @smslen = @const1 OR @smslen = @const2 OR @smslen = @const3 OR @smslen = @const4 OR @smslen = @const5 
    EXEC ParsingProcedureRX8 @ProductCode = @smsgpsmessage; 
END 

Я не знаю, если это правильно или неправильно, но она работает только и только тогда, когда длина 134 или 133.

Теперь будем называть SP как указано в последней части спускового крючка и вот SP

USE [SMSGPS] 
GO 
/****** Object: StoredProcedure [dbo].[ParsingProcedureRX8] Script Date: 11/17/2014 11:00:09 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[ParsingProcedureRX8] 
@ProductCode VARCHAR(500) 
AS 
SET NOCOUNT ON; 
INSERT INTO tblKMRUN2(Account,TrxDateTime,PhilTime, Lat, Long, Speed2, DeviceStatus, Engine, 
    KmRun, ProcStatus) 
SELECT [Account] = LEFT(@ProductCode,CHARINDEX(',',@ProductCode) - 1), 
    [TrxDateTime] = cast(stuff(stuff(stuff((SUBSTRING(@ProductCode, 27, 12)), 7,0,' '), 10,0,':'), 13,0,':') as datetime), 
    [PhilTime] = cast(stuff(stuff(stuff((SUBSTRING(@ProductCode, 27, 12)), 7,0,' '), 10,0,':'),13,0,':') as datetime), 
    [Lat] = cast(SUBSTRING(@ProductCode, 42, 9) as float)/100, 
    [Long] = cast(SUBSTRING(@ProductCode, 53, 10) as float)/100, 
    [Speed2] = SUBSTRING(@ProductCode, 65, 1), 
    [statcode] = SUBSTRING(@ProductCode, 78, 8), 
    [ENGINE] = CASE WHEN (SUBSTRING(@ProductCode, 78, 1) = '2') 
       THEN 'ON' 
       ELSE 'OFF' END, 
    [KM2] = round(cast(right(@ProductCode, 11)as float)/3600, 0, 1), 
    [ProcStatus] = '0'; 

при попытке вставить вторую строку, которая является

351856040520298,241111; 1R, 141117003059, А, 1420.4629N, 12058.7028E, 0.0,77,0.9,20000006; 2R, 141117003059,11,98.3,12.58,04.10,282098820.9

он возвращает ошибку, которая говорит,

Msg 8114, Level 16, State 5, Procedure ParsingProcedureRX8, Line 5 
Error converting data type varchar to float. 

но когда я попробовать использовать другую строку не возвращает ошибку при всех

POlease помощь.

Спасибо.

+0

Вы знаете, что триггеры операции массового отражение в данных в 'inserted'? – bummi

ответ

1

В хранимой процедуре ввода

351856040520298,241111;1R,141117003059,A,1420.4629N,12058.7028E,0.0,77,0.9,20000006;2R,141117003059,11,98.3,12.58,04.10,282098820.9 

для запроса ниже

[statcode] = SUBSTRING(@ProductCode, 78, 8) 

Возврат:

000006;2 

, которые не могут быть преобразованы в Float.

Пробуйте ввести входной сигнал правильно.

Для первого ввода значения для [statecode] is 21010000, которые могут быть преобразованы в плавать Но, второе входное значение является 000006;2, который не может быть преобразован в float.

Используйте приведенный ниже запрос, чтобы проверить, соответствуют ли значения из @ProductCode или нет.

Назначают ввод в 'SET @ProductCode'

DECLARE @ProductCode VARCHAR(500) 
SET @ProductCode = '351856040520298,241111;1R,141117003059,A,1420.4629N,12058.7028E,0.0,77,0.9,20000006;2R,141117003059,11,98.3,12.58,04.10,282098820.9' 
SELECT 
    [Account] = LEFT(@ProductCode,CHARINDEX(',',@ProductCode) - 1), 
    [TrxDateTime] = cast(stuff(stuff(stuff((SUBSTRING(@ProductCode, 27, 12)), 7,0,' '), 10,0,':'), 13,0,':') as datetime), 
    [PhilTime] = cast(stuff(stuff(stuff((SUBSTRING(@ProductCode, 27, 12)), 7,0,' '), 10,0,':'),13,0,':') as datetime), 
    [Lat] = cast(SUBSTRING(@ProductCode, 42, 9) as float)/100, 
    [Long] = cast(SUBSTRING(@ProductCode, 53, 10) as float)/100, 
    [Speed2] = SUBSTRING(@ProductCode, 65, 1), 
    [statcode] = SUBSTRING(@ProductCode, 78, 8), 
    [ENGINE] = CASE WHEN (SUBSTRING(@ProductCode, 78, 1) = '2') 
       THEN 'ON' 
       ELSE 'OFF' END, 
    [KM2] = round(cast(right(@ProductCode, 11)as float)/3600, 0, 1), 
    [ProcStatus] = '0'; 
0

Для меня это работает идеально с любым изменением. Я рекомендую вам обновить ваш запрос к этому

USE [SMSGPS] 
GO 
/****** Object: Trigger [dbo].[CallSPGPRSIN] Script Date: 11/17/2014 9:43:44 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[CallSPGPRSIN] 
ON [dbo].[GPRSIN] 
AFTER INSERT 
AS BEGIN 
DECLARE @smsgpsmessage varchar(500); 
DECLARE @smslen varchar(10); 

SET @smsgpsmessage = (SELECT TOP 1 smsmsg FROM GPRSIN order by smsdt desc); 
SET @smslen = (SELECT LEN(@smsgpsmessage)); 

if (@smslen between 130 and 135) 
    EXEC ParsingProcedureRX8 @ProductCode = @smsgpsmessage; 
END 
Смежные вопросы