Files
DP44/DataPRO_sql/dbo.sp_DBImportSensorsDigitalInput.StoredProcedure.sql
2026-04-17 14:55:32 -04:00

212 lines
12 KiB
Transact-SQL
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
USE [DataPRO]
GO
/****** Object: StoredProcedure [dbo].[sp_DBImportSensorsDigitalInput] Script Date: 6/19/2018 12:23:52 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_DBImportSensorsDigitalInput]
@DigitalInputSensors xml
,@errorNumber int output
,@errorMessage nvarchar(250) output
AS
BEGIN
set @errorNumber = 0
set @errorMessage = ''
declare @tSensorsDigitalIn table
([SerialNumber] [nvarchar](50),
[SettingMode] [int],
[ScaleMultiplier] [nvarchar](50),
[LastModified] [datetime],
[LastModifiedBy] [nvarchar](50),
[eId] [nvarchar](50),
[UserValue1] [nvarchar](255),
[UserValue2] [nvarchar](255),
[UserValue3] [nvarchar](255),
/*[UserTags] [varbinary](max) NULL,*/
[UserTagsText] [nvarchar](4000) NULL,
[MeasurementUnit] [nvarchar](50),
[FilterClass] [nvarchar](50),
[Processed] [bit])
insert into @tSensorsDigitalIn
(SerialNumber
, SettingMode
, ScaleMultiplier
, LastModified
, LastModifiedBy
, eId
, UserValue1
, UserValue2
, UserValue3
/*, UserTags*/
, UserTagsText
, MeasurementUnit
, FilterClass
,Processed)
select
t.x.value('DigitalInputSettingName[1]', 'nvarchar(50)') as SerialNumber
, dbo.foo_SettingModeConverterToInt(t.x.value('DigitalInputSettingMode[1]', 'nvarchar(50)')) as SettingMode
, t.x.value('DigitalInputScaleMultiplier[1]', 'nvarchar(50)') as ScaleMultiplier
, getdate() as LastModified /* t.x.value('@LastModified', 'datetime') */
, 'DBImport' as ModifiedBy /* t.x.value('@ModifiedBy', 'varchar(50)') */
, CASE WHEN t.x.value('eId[1]', 'varchar(50)') IS NULL THEN ''
ELSE t.x.value('eId[1]', 'varchar(50)') end as eId
, t.x.value('UserValue1[1]', 'nvarchar(255)') as UserValue1
, t.x.value('UserValue2[1]', 'nvarchar(255)') as UserValue2
, t.x.value('UserValue3[1]', 'nvarchar(255)') as UserValue3
/*, CASE WHEN t.x.value('UserTags[1]', 'varbinary(max)') IS NULL THEN 0
ELSE t.x.value('UserTags[1]', 'varbinary(max)') end as UserTags */
, CASE WHEN t.x.value('UserTags[1]', 'nvarchar(4000)') IS NULL THEN ''
ELSE t.x.value('UserTags[1]', 'nvarchar(4000)') end as UserTagsText
, 'V' /* Change this if MeasurementUnit is ever exported */
, '1650 (CFC1000)' /* Change this if FilterClass is ever exported */
, 0
from @DigitalInputSensors.nodes('/Sensors/SensorData') t(x) OPTION (OPTIMIZE FOR ( @DigitalInputSensors = NULL ))
while (Select Count(*) From @tSensorsDigitalIn Where Processed = 0) > 0
Begin
begin try
begin transaction tSensorsDigitalIn
declare
@SerialNumber nvarchar(50)
,@SettingMode int
,@ScaleMultiplier nvarchar(50)
,@LastModified datetime
,@LastModifiedBy nvarchar(50)
,@eId nvarchar(50)
,@UserValue1 nvarchar(255)
,@UserValue2 nvarchar(255)
,@UserValue3 nvarchar(255)
,@UserTags varbinary(max)
,@UserTagsText nvarchar(4000)
,@MeasurementUnit nvarchar(50)
,@FilterClass nvarchar(50)
,@new_id int
select top 1 @SerialNumber = SerialNumber
,@SettingMode = SettingMode
,@ScaleMultiplier = ScaleMultiplier
,@LastModified = LastModified
,@LastModifiedBy = LastModifiedBy
,@eId = eId
,@UserValue1 = UserValue1
,@UserValue2 = UserValue2
,@UserValue3 = UserValue3
/*,@UserTags = UserTags*/
,@UserTagsText = UserTagsText
,@MeasurementUnit = MeasurementUnit
,@FilterClass = FilterClass
from @tSensorsDigitalIn where Processed = 0
declare @tagTable TABLE (Element nvarchar(4000), Processed bit)
declare @tagIdTable TABLE (Id int, Processed bit)
insert into @tagTable (Element, Processed) select * from dbo.foo_SplitDelimitedString(@UserTagsText, ',')
/*call foo_IdGetTag to get the tag id */
while (Select Count(*) From @tagTable Where Processed = 0) > 0
Begin
begin try
declare @tagName nvarchar(4000)
declare @tagIdTemp int
select top 1 @tagName = Element from @tagTable where Processed = 0
set @tagIdTemp = dbo.foo_IdGetTag(@tagName)
insert into @tagIdTable (Id, Processed) VALUES (@tagIdTemp, 0)
end try
begin catch
set @errorNumber = error_number()
set @errorMessage = error_message()
rollback transaction tSensorsAnalog
end catch;
update @tagTable set Processed = 1 where Element = @tagName
End
/*store in a byte array*/
while (Select Count(*) From @tagIdTable Where Processed = 0) > 0
Begin
begin try
declare @tagId int
declare @tagIdByte varbinary(4)
select top 1 @tagId = Id from @tagIdTable where Processed = 0
set @tagIdByte = dbo.foo_ConvertIntToBytes(@tagId)
set @UserTags = CONVERT(varbinary(max), CONCAT(@UserTags, @tagIdByte))
end try
begin catch
set @errorNumber = error_number()
set @errorMessage = error_message()
rollback transaction tSensorsAnalog
end catch;
update @tagIdTable set Processed = 1 where Id = @tagId
End
exec dbo.sp_SensorsDigitalInUpdateInsert @SerialNumber
,@SettingMode
,@ScaleMultiplier
,@LastModified
,@LastModifiedBy
,@eId
,@UserValue1
,@UserValue2
,@UserValue3
,@UserTags
,@MeasurementUnit
,@FilterClass
,@new_id
,@errorNumber output
,@errorMessage output
update @tSensorsDigitalIn set Processed = 1 where SerialNumber = @SerialNumber
commit transaction tSensorsDigitalIn
end try
begin catch
set @errorNumber = error_number()
set @errorMessage = error_message()
rollback transaction tSensorsDigitalIn
end catch;
end
END