Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

23. Mai 2007 um 20:00

Online-Bewerbungen und Fachkräftemangel

Laut dem Artikel "Mittelstand gehen die Fachkräfte aus" in der Zeitschrift IT-Mittelstand (Ausgabe 5/2007) nutzen noch relativ wenig Firmen deren Homepage für die "Rekrutierung neuer Mitarbeiter".

Aufgeschlüsselt nach Firmengröße (in Mitarbeitern):
50 – 100: 15,5%
100 – 300: 19,5%
300 – 500: 24%
500 – 1000: 27%
>1000 : 26%

Leider ist es wie so oft in diesem Magazin: Eine technische Lösung wird hoch umjubelt, negative Punkte kommen nicht vor und eine differenzierte Betrachtung findet nicht statt. Der Grund ist meist, dass Artikel stark an den Veröffentlichungen einer Firma angelehnt sind. In diesem Fall der Firma "s+p Software und Consulting AG", die Personalsoftware vertreibt.
Der Artikel wird damit eingeleitet, dass "wegen der demografischen Entwicklung" mit stark rückläufigen Ausbildungszahlen zu rechnen ist. Deswegen müssen Firmen um Mitarbeiter stärker werben und die Personalbeschaffung soll mit geeigneter Software unterstützt werden.

Hier würde ich mir eine mehrdimensionale Betrachtung wünschen: Wie spielt die Verlängerung der Lebensarbeitszeit da mit rein? Kann es so bleiben, dass die Firmen Ihre IT-Mitarbeiter mit 55 Jahren in den Vorruhestand schicken?
Warum gelingt es den Firmen nicht ausreichend IT-Fachkräfte auszubilden? Gibt es wirklich zu wenig Interessenten?

Ich habe keine Ahnung, ob unsere Firma repräsentativ ist, aber meines Wissens haben wir immer deutlich mehr Bewerber für Ausbildungsplätze als wir dann nehmen können. Könnte es sein, dass die Firmen, die sich beschweren gar keine oder nur wenige IT-Lehrlinge ausbilden? 😕

23. Mai 2007 um 19:58

SQL Server: Trailings blanks

When SQL Server compares two strings, it makes a comparison from left to right and treats the shorter expression as though it was padded with spaces to equal the length of the longer string.
For most people the result is unexpected: padded blanks are ignored!

Lets see some samples:

'Hello ' = 'Hello' --> true

The same applies for unicode:

N'Hello ' = N'Hello' --> true

LIKE behaves a little different. Firstly comparing unicode results different:

'Hello ' LIKE 'Hello' --> true
N'Hello ' LIKE N'Hello' –> false

And second blanks in the pattern are allways significant:

'Hello' LIKE 'Hello ' --> false
N'Hello' LIKE N'Hello ' –> false

What about LEN? It behaves consistent to the test for equality: padding blanks are ignored.

LEN('Hello') --> 5
LEN('Hello ') –> 5
LEN(N'Hello') –> 5
LEN(N'Hello ') –> 5

DATALENGTH('Hello') --> 5
DATALENGTH('Hello ') –> 6
DATALENGTH(N'Hello') –> 10
DATALENGTH(N'Hello ') –> 12

So we have some possible solutions, if we neeed to check for equality with blank awareness:

1. Use allways unicode and LIKE
2. add some dummy character at the end:
'Hello'+ '#'= 'Hello '+ '#'
N'Hello'+N'#'=N'Hello '+N'#'

3. convert to varbinary:
cast( 'Hello ' as varbinary(10)) = cast( 'Hello' as varbinary(10))
cast(N'Hello ' as varbinary(20)) = cast(N'Hello' as varbinary(20))

4. compare datalength:
'Hello'= 'Hello ' AND DATALENGTH( 'Hello')=DATALENGTH( 'Hello ')
N'Hello'=N'Hello ' AND DATALENGTH(N'Hello')=DATALENGTH(N'Hello ')

P.S.
Please be aware that the described behavior applies only to varchar and nvarchar, not char/nchar!
CHAR/NCHAR are always filled with blanks.
If you use ANSI_PADDING OFF trailing blanks are trimmed when inserted in a table.

-- ANSI
declare @vchar1 varchar(10),
@vchar2 varchar(10);

set @vchar1 = 'Hello ';
set @vchar2 = 'Hello';

select
'"'+@vchar1+'"' as "@vchar1",
'"'+@vchar2+'"' as "@vchar1",
case when @vchar1=@vchar2
then 'true'
else 'false' end as "@vchar1=@vchar2",
case when @vchar1 like @vchar2
then 'true'
else 'false' end as "@vchar1 like @vchar2",
case when @vchar2 like @vchar1
then 'true'
else 'false' end as "@vchar2 like @vchar1", –> false
case when @vchar1+'#'=@vchar2+'#'
then 'true'
else 'false' end as "@vchar1+'#'=@vchar2+'#'", –> false
case when cast(@vchar1 as varbinary(10)) = cast(@vchar2 as varbinary(10))
then 'true'
else 'false' end as "cast(@vchar1 as varbinary(10)) = cast(@vchar2 as varbinary(10))",
case when @vchar1=@vchar2 AND DATALENGTH(@vchar1)=DATALENGTH(@vchar2)
then 'true'
else 'false' end as "@vchar1=@vchar2 AND DATALENGTH(@vchar1)=DATALENGTH(@vchar2)";
go

– Unicode
declare @nvchar1 nvarchar(10),
@nvchar2 nvarchar(10);

set @nvchar1 = 'Hello ';
set @nvchar2 = 'Hello';

select
'"'+@nvchar1+'"' as "@nvchar1",
'"'+@nvchar2+'"' as "@nvchar1",
case when @nvchar1=@nvchar2
then 'true'
else 'false' end as "@nvchar1=@nvchar2",
case when @nvchar1 like @nvchar2
then 'true'
else 'false' end as "@nvchar1 like @nvchar2",
case when @nvchar2 like @nvchar1
then 'true'
else 'false' end as "@nvchar2 like @nvchar1",
case when @nvchar1+'#'=@nvchar2+'#'
then 'true'
else 'false' end as "@nvchar1+'#'=@nvchar2+'#'",
case when cast(@nvchar1 as varbinary(20)) = cast(@nvchar2 as varbinary(20))
then 'true'
else 'false' end as "cast(@nvchar1 as varbinary(20)) = cast(@nvchar2 as varbinary(20))",
case when @nvchar1=@nvchar2 AND DATALENGTH(@nvchar1)=DATALENGTH(@nvchar2)
then 'true'
else 'false' end as "@nvchar1=@nvchar2 AND DATALENGTH(@nvchar1)=DATALENGTH(@nvchar2)";

|