Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MSSQL : Funktion zum Vergleichen von nvarchar - Problem (https://www.delphipraxis.net/37702-mssql-funktion-zum-vergleichen-von-nvarchar-problem.html)

jensw_2000 9. Jan 2005 03:07


MSSQL : Funktion zum Vergleichen von nvarchar - Problem
 
Ich habe mir eine kleine Funktion gebastelt, die eigentlich funktioniert :roll:

Sie vergleicht 2 NVarchar Werte und gibt ein Bit als Ergebnis zurück

SQL-Code:
CREATE FUNCTION Compare (@Param1 nvarchar(100)='',@Param2 nvarchar(100)='')
  RETURNS bit
AS
BEGIN
  DECLARE @fn_result bit

  set @fn_Result=0

  if RTRIM (UPPER (@Param1) ) = RTRIM (UPPER (@Param2) ) SET @fn_result=1

  RETURN @fn_result
END
Jetzt zum "eigentlich"...

Einige meiner Tabellen haben UniqueIdentifier als Primary Keys.


Vereinfachtes Bespiel:

SQL-Code:
User
ID   UniqueIdentifier
Name   NVarchar(30)
Vorname NVarchar(10)


Adressen
ID   UniqueIdentifier
ID_User NVarchar(38)
Strasse   NVarchar(30)
PLZ    NVarchar(5)
Ort   NVarchar(30)


Test1:

SQL-Code:
Select Vorname, Name, Compare(ID,'{B273E8A2-F797-4C17-99CA-BC30F0B8FC09}') as 'Marker'
     FROM User
-- ergibt: Marker = 0 obwohl das eine gültige User ID ist ...

Test2:

SQL-Code:
Select Vorname, Name, Compare(ID,ID) as 'Marker'
     FROM User
-- ergibt: Marker = 1 , also kein Problem mit GUIDS

Test3:

SQL-Code:
Select Vorname, Name, Compare('Piffel','piffel   ') as 'Marker'
     FROM User
-- ergibt: Marker = 1 , also kein Problem mit NVarchars

Test4:

SQL-Code:
Select Vorname, Name, Compare(CAST(ID as NVarchar(38)),
                                   '{B273E8A2-F797-4C17-99CA-BC30F0B8FC09}') as 'Marker'
     FROM User
-- ergibt: Marker = 0 , CONVERT liefert das selbe Ergebnis



Warum verflixt funktionieren Test 1 und Test 4 nicht ?

Joins zwischen User und Adressen funktionieren ja auch, obwohl User.ID vom Typ GUID und Adressen.ID_User vom Typ NVarchar ist.

Ich finde keine sinnvolle Erklärung. Fällt Euch dazu was ein ?

Hansa 9. Jan 2005 03:31

Re: MSSQL : Funktion zum Vergleichen von nvarchar - Problem
 
Warum benutzt du NVarchar ? Da spielt der eingestellte Zeichensatz eine große Rolle und deshalb geht es wohl auch nicht richtig. 8)

jensw_2000 9. Jan 2005 10:14

Re: MSSQL : Funktion zum Vergleichen von nvarchar - Problem
 
Habs grade mal mit Varchar probiert, das selbe Verhalten ...

jensw_2000 9. Jan 2005 11:08

Re: MSSQL : Funktion zum Vergleichen von nvarchar - Problem
 
Gefunden :wink:

Wenn man einen UniqueIdentifier in einen NVarchar bzw. VarChar Casted, dann werden dabei die Klammern entfernt.

SQL-Code:
CAST(ID as NVarchar(38))
 -- sieht nicht so aus '{B273E8A2-F797-4C17-99CA-BC30F0B8FC09}'
 --sondern so ...     'B273E8A2-F797-4C17-99CA-BC30F0B8FC09'
Mist, das hat mich jetzt 5 Stunden aufgehalten. :wall:

Die CompareStr Funktion habe ich jetzt so umgebaut ...

SQL-Code:
CREATE FUNCTION CompareStr (@Param1 NVarchar(100)='', @Param2 NVarchar(100)='')
RETURNS bit
AS
BEGIN
  -- Parameter auf geschweifte Klammern überprüfen und diese ggf. entfernen
  Set @Param1=REPLACE(@Param1,'{','')
  Set @Param1=REPLACE(@Param1,'}','')

  Set @Param2=REPLACE(@Param2,'{','')
  Set @Param2=REPLACE(@Param2,'}','')


  DECLARE @fn_result bit

  set @fn_Result=0

  if RTRIM (UPPER (@Param1) ) = RTRIM (UPPER (@Param2) ) SET @fn_result=1 

  RETURN @fn_result

END

Schöne Grüße,
Jens

:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz