Avatar billede hansa Nybegynder
05. november 2003 - 09:26 Der er 6 kommentarer og
1 løsning

Problem med datatypen

Hej,

Jeg har et lille problem med nedenstående statement.

Følgende:
(SELECT SUBSTRING(path, 2, LEN(path)-2) FROM dbo.structure WHERE id = 12362)
returnerer en liste. Ekspemel:  1,2,10,44

Problemer er at typen er nvarchar, og at jeg gerne skulle bruge listen af typen int. Insætter jeg manuelt tallene som vist i eksemplet virker det fint.

Er der ikke en måde automatisk at konvertere listen til int? Jeg har prøvet med CONVERT, men uden held.

Her er helt statementet:

SELECT * FROM dbo.structure
WHERE id IN
(SELECT SUBSTRING(path, 2, LEN(path)-2) FROM dbo.structure WHERE id = 12362)

På forhånd tak!
Avatar billede bjornicle Nybegynder
05. november 2003 - 20:58 #1
Har du provet med:

SELECT * FROM dbo.structure
WHERE id IN
(SELECT cast(SUBSTRING(path, 2, LEN(path)-2) as int) FROM dbo.structure WHERE id = 12362)
Avatar billede hansa Nybegynder
06. november 2003 - 07:17 #2
Ja, jeg har prøvet både med CONVERT og CAST, og får følgende fejl:

Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the nvarchar value '1,2,553,5250,12362' to a column of data type int.
Avatar billede bjornicle Nybegynder
06. november 2003 - 10:13 #3
ok, saa er din eneste mulighed at lave en funktion som splitter strengen, jeg har noget kode liggende et eller andet sted som kan gore dette, saa sig lige til hvis jeg skal lede efter det, optimalt bør du aendre i din database da dataen jo aabentbart gemmes paa en meget ringe maade
Avatar billede hansa Nybegynder
06. november 2003 - 12:13 #4
Du må meget gerne kigge efter funktionen :-)

Jeg har desværre ikke mulighed for at ændre databasen, da jeg tilgår den uden om et system, der benytter den.
Avatar billede bjornicle Nybegynder
06. november 2003 - 12:46 #5
Her er det kode jeg udviklede, jeg tror aldrig jeg fik det brugt, men det du skal gore er bare at lave det til en funktion, og istedet for at printe hvert element faar du den bare til at retunere et table, det kan du jo snildt gore med et temptable

CREATE PROCEDURE dbo.test_list
    @list varchar(8000)
AS

declare @varlen int
declare @counter int
declare @tempvar varchar(8000)
declare @commafind int
declare @sublen int
declare @delimiter char(1)
set @delimiter = ','

set @varlen = len(@list)
set @counter = 1

while (@varlen >= @counter)
begin
    set @commafind = charindex(@delimiter, @list, @counter)
    if (@commafind = 0)
        set @sublen = @varlen
    else
        set @sublen = @commafind - @counter

    set @tempvar = substring(@list,@counter,@sublen)
    set @counter = @commafind+1
   
    if (len(@tempvar) > 0)
        select 'This item is: ' + @tempvar

    if (@commafind = 0)
        break
end
GO
Avatar billede hansa Nybegynder
06. november 2003 - 12:57 #6
1000 tak for hjælpen!
Smider du ikke et svar, så du kan få dine velfortjene point
Avatar billede bjornicle Nybegynder
06. november 2003 - 13:02 #7
jow, hvis du faar problemer med at lave funktionen siger du bare til
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester