November 26, 2003 at 6:52 am
If I have an empty tag in my xml e.g. <StartDate/>, why does the value in my date field get set to 1900-01-01 rather than NULL?
November 26, 2003 at 7:28 am
To get a null datetime value, you need to omit the tag completely or specify the null value explicitly. For example, you could use a case statement:
...
select case StartDate
when '' then null
else StartDate
end
from OpenXML(...)
<oops tags wrong>
Cheers,
mia
Life moves pretty fast. If you don't stop and look around once in a while, you could miss it.
Edited by - mia on 11/26/2003 07:28:59 AM
Cheers,
mia
Life moves pretty fast. If you don't stop and look around once in a while, you could miss it.
November 26, 2003 at 7:37 am
I was hoping that wouldn't be the answer. Wonder why they did it like that - surely specifying a blank tag equates to an unknown value.
How would I specify NULL in the XML? Won't <StartDate>NULL</StartDate> attempt to put the text "NULL" in the field (didn't try yet)?
November 26, 2003 at 7:47 am
The empty StartDate tag equates to an empty string. Inserting an empty string value into a datetime column, even when that column accepts nulls, will insert the value '1900-01-01' into the column. Not really sure why that is although I'm sure there's an explanation somewhere!
Putting the text value NULL in the StartDate tag will result in a data type conversion error as it tries to convert that string to a date. You can't actually specify null in the XML in this case. I think the only options are to omit the tag from the XML when it has no value, which will equate to a null value, or use a case statement to specify null in the database when the StartDate tag is empty. If that isn't helpful, maybe post some code & see if that sheds any light?
Cheers,
mia
Life moves pretty fast. If you don't stop and look around once in a while, you could miss it.
Cheers,
mia
Life moves pretty fast. If you don't stop and look around once in a while, you could miss it.
November 26, 2003 at 7:57 am
As you say - "Life Moves Fast"
So I've already started adding case statements to all my procs. I had hoped to pass the buck to the business layer programmer but he says he is just calling the serializable attribute of a C# object and can't omit blank tags...
For what it's worth, here's my code..
UPDATE tmd..TaskActions
SET ActionDesc = xDescription,
StartDate = case xStartDate when '' then null else xStartDate end,
EndDate = case xEndDate when '' then null else xEndDate end,
Status = case xStatus when '' then null else xStatus end,
Officer = case xOfficer when '' then null else xOfficer end,
AssociatedOfficers = case xSecondOfficer when '' then null else xSecondOfficer end,
Location = case xPlace when '' then null else xPlace end,
Results = case xResults when '' then null else xResults end,
ByWhom = current_user,
WhenMod = getdate()
FROM OPENXML (@pidoc, '/Action')
WITH (xActionint'@ActionID',
xDescription varchar(1000) 'Description',
xStartDatedatetime'StartDate',
xEndDatedatetime'EndDate',
xStatusvarchar(40)'Status',
xOfficervarchar(40)'Officer',
xSecondOfficervarchar(40)'SecondOfficer',
xPlacevarchar(25)'Place',
xResultsvarchar(4000)'Results')
WHERE ActionID = xAction
November 26, 2003 at 8:08 am
Just realised this! Rather than the long-winded case statement, you might be able to use the nullif() function. Sorry I didn't mention this sooner!
i.e. instead of:
StartDate = case xStartDate when '' then null else xStartDate end
you would have:
StartDate = nullif(xStartDate, '')
In this case, life moved too fast - sorry again!
Cheers,
mia
Life moves pretty fast. If you don't stop and look around once in a while, you could miss it.
Cheers,
mia
Life moves pretty fast. If you don't stop and look around once in a while, you could miss it.
November 26, 2003 at 8:13 am
Never heard of NULLIF but looks just right. Damn, I should slow down a bit. I've got 6 procs to change again.
Thanks!!
Viewing 7 posts - 1 through 7 (of 7 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy