none
Fehler beim Konvertieren des nvarchar-Werts '--' in den int-Datentyp RRS feed

  • Frage

  • Hallo zusammen,
    ich habe folgende Abfrage.

    select * from export.dbo.UserString a
    where a.UserString = (select 1 from export.dbo.test b
    		where CONVERT(VarChar(80),b.ID) = CONVERT(VarChar(80), a.UserString) 
    		and b.ID is not null)

    Diese läuft bei mir aber in den Fehler
    -->
    Meldung 245, Ebene 16, Status 1, Zeile 2
    Fehler beim Konvertieren des nvarchar-Werts '--' in den int-Datentyp.
    <--
    Statt die (im gesendeten Beispiel) 3 Ergebnisse zu liefern.

    Warum ???
    Und wie kann ich das am elegantesten umgehen ???
    Oder habe ich hier eventuell einen Denkfehler ??? (wäre ja nicht das erste mal)

    Unten bringe ich noch mal eine Tabelle mit ein paar Testwerten.

    Danke und Gruß
         Stephan

    USE [export]
    GO
    
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Test](
    	[ID] [nvarchar](80) NULL
    ) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[UserString](
    	[UserString] [nvarchar](max) NOT NULL
    ) ON [PRIMARY]
    GO
    
    INSERT INTO Test VALUES ('7cad497c7a49aba1cc785110d30dac293917f3ed'),
    			('d8f270007a63520dc4a9dda7668c15a85b057b98'),
    			('d1fc340a6c79718608a9a93d1a31aba6d536524e'),
    			('21a02d74a80d9151b3c1d1af60e22c9257268e63'),
    			('9f1ca0c9b00a2eb98f8db06e537a544338b3d46b'),
    			('2e9b7030f6f4dfbfcc3deb0931b23fbd1973eb2b'),
    			('6a082dbea6e10e20589872ba02d99cf44e24fc06'),
    			('8cef476b234dce80082578ece6e394afeb6d4bf7')
    GO
    
    INSERT INTO UserString VALUES	('--'),
    				('7cad497c7a49aba1cc785110d30dac293917f3ed'),
    				('d8f270007a63520dc4a9dda7668c15a85b057b98'),
    				('d1fc340a6c79718608a9a93d1a31aba6d536524e')
    GO

    Mittwoch, 2. März 2016 16:53

Antworten

  • Hallo Stephan,

    in deiner Unterabfrage gibst Du per SELECT 1 eine Zahl zurück. Und -- kann nunmal keine Zahl sein bzw. nicht in eine konvertiert werden.

    Ändere deine Abfrage bspw. wie folgt:

    SELECT *
    FROM   UserString a
    WHERE  a.UserString IN (
                            SELECT ID FROM
                            Test b
    		                WHERE CONVERT( VarChar( 80 ), b.ID ) = CONVERT( VarChar( 80 ), a.UserString )
    		                AND   b.ID IS NOT NULL
    		               )

    P.S.: a.UserString = ( SELECT ... habe ich zudem in a.UserString IN ( SELECT ... geändert, da mehr als ein Datensatz in der inneren Abfrage zurückgegeben wird, das funktioniert aber nicht mit =.




    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 2. März 2016 18:26
    Moderator
  • Da Du im Sub-Select eh auf a.Userstring prüfst, kannst Du auch eine EXISTS Anweisung verwenden:

    select * 
    from export.dbo.UserString a
    where EXISTS (select 1 
                  from export.dbo.test b
    	      where CONVERT(VarChar(80),b.ID) = CONVERT(VarChar(80), a.UserString) 
    	            and b.ID is not null)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 3. März 2016 07:38

Alle Antworten

  • Hallo Stephan,

    in deiner Unterabfrage gibst Du per SELECT 1 eine Zahl zurück. Und -- kann nunmal keine Zahl sein bzw. nicht in eine konvertiert werden.

    Ändere deine Abfrage bspw. wie folgt:

    SELECT *
    FROM   UserString a
    WHERE  a.UserString IN (
                            SELECT ID FROM
                            Test b
    		                WHERE CONVERT( VarChar( 80 ), b.ID ) = CONVERT( VarChar( 80 ), a.UserString )
    		                AND   b.ID IS NOT NULL
    		               )

    P.S.: a.UserString = ( SELECT ... habe ich zudem in a.UserString IN ( SELECT ... geändert, da mehr als ein Datensatz in der inneren Abfrage zurückgegeben wird, das funktioniert aber nicht mit =.




    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 2. März 2016 18:26
    Moderator
  • Da Du im Sub-Select eh auf a.Userstring prüfst, kannst Du auch eine EXISTS Anweisung verwenden:

    select * 
    from export.dbo.UserString a
    where EXISTS (select 1 
                  from export.dbo.test b
    	      where CONVERT(VarChar(80),b.ID) = CONVERT(VarChar(80), a.UserString) 
    	            and b.ID is not null)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 3. März 2016 07:38
  • Danke an euch beide.

    Beide Lösungen bringen mich dahin wo ich hin muss.

    Gruß
        Stephan

    Donnerstag, 3. März 2016 08:38