Tag: SQL
Timestamp and validation
by mysticslayer on Jul.13, 2009, under Programming, sql server, SSIS
Timestamp in SQL Server:
1) The SQL Server timestamp data type has nothing to do with times or dates. SQL Server timestamps are binary numbers that indicate the relative sequence in which data modifications took place in a database. The timestamp data type was originally implemented to support the SQL Server recovery algorithms.
2) It further states Never use timestamp columns in keys, especially primary keys, because the timestamp value changes every time the row is modified.
For a customer we made some changes. And the situation is as follows. We exported the data to excel. Multiple tabels are exported. We changed the data in the excel file and the customer validated the data. We also did export the timetamp with the data. Why? Because we had to import it again to the database. If a Timestamp changed, we should not update the data from the excel file. That’s why.
Problem situation:
Because a timestamp isn’t a varchar, or numeric value, but a binary(8) value we had to convert it. Because we import the data by SSIS back into the database. But the data we imported is from a flat text file. So every column was read as a DT_STR by SSIS, and timestamp in the stored procedure was a datatype of Timestamp. So we did a comparison of a varchar against a timestamp. Well that situation didn’t work out that well.
So what we did was to change the parameter of the stored procedure to varchar. Well SQL Server can’t handle a comparison of varchar against timestamp inside the stored procedure. Of course, so we did try it to convert it to a varbinary(8) or binary(8) and then validate it against the timestamp. Well that didn’t work out that well.
declare @timestamp varbinary(8)
set @timestamp = CONVERT(varbinary(8), '0x0000000001F4AD88')
print @timestamp
returned: 0x3078303030303030
declare @timestamp varbinary(8)
set @timestamp = CONVERT(varbinary(8), 0x0000000001F4AD88)
print @timestamp
returned: 0x0000000001F4AD88
That comparison didn’t work well. So I had to figure an other way to validate on timestamp. When I almost lost my hope I wrote a function in SQL Server.
create function [dbo].[sp_hexadecimal] ( @var varbinary(255) )
returns varchar(255)
as
begin
declare @charval varchar(255)
declare @i int
declare @length int
declare @hex char(16)
select @charval = '0x'
select @i = 1
select @length = datalength(@var)
select @hex = '0123456789abcdef'
while (@i <= @length)
begin
declare @tempint int
declare @firstint int
declare @secondint int
select @tempint = convert(int, substring(@var,@i,1))
select @firstint = floor(@tempint/16)
select @secondint = @tempint - (@firstint*16)
select @charval = @charval +
substring(@hex, @firstint+1, 1) +
substring(@hex, @secondint+1, 1)
select @i = @i + 1
end
return ( @charval )
end
So what I did was the other. I managed to validate the data on the other way.
it did the trick...
DataFlow in SSIS and OLE DB Command
by mysticslayer on Jul.11, 2009, under Programming, sql server, SSIS
I’ve been working for the first time with a DataFlow of updating data in a SQL Database with SSIS. The only problem is that a colleaque did made it, but he forget something with it. After reading some documentation about the DataFlow in SSIS and the using of a OLE DB command to execute a Stored Procedure I came to a certain problem.
The problem is that a OLE DB Command can execute a Stored Procedure, but the error handling is really a issue. Why, you can give a output parameter with it, but for some reason it doesn’t work well. The question is why they didn’t use a SQL Task to execute a Stored Procedure. Now I’m searching why my stored procedure isn’t fired well.
Well the problem is that the stored procedure contains a error handling not supported by the OLE DB Command. And when you have error handling handled by you SSIS you get a Error Number 0 returned. So your searching for a problem with Error number 0? That’s really crap. So I get rid of the Error handling in the stored procedure, and well the funny thing is that the stored procedure really is fired well and with filled parameters. But another problem is now that there are not enough parameters filled to execute the Stored Procedure properly.
So I have to search for that issue to solve the problem….