Avatar billede faithless Praktikant
06. januar 2010 - 20:04 Der er 12 kommentarer og
1 løsning

Convert in en Update qry

Hejsa

Jeg er ikke nogen ørn til sql, så er havnet i lidt af et problem. Jeg sidder selvfølgelig med lortet nu, uden andre at spørge end jer (c:

Jeg skal ha' sat 25 stored procedures over i aften, så de kan være færdig i morgen. Så jeg smider mange point på, i håbet om at hjælpen så kommer i aften.

Koden

UPDATE CT_Data.dbo.CT_data
SET CT_Data.dbo.CT_data.txt13 = CONVERT(bigint,left(CT_Data.dbo.CT_data.F0108,13))
FROM CT_Data.dbo.CT_data
WHERE CT_Data.dbo.CT_data.F0136 is null and isnumeric(left(CT_Data.dbo.CT_data.F0108,13)) =1

Fejlen
Incorrect syntax near the keyword 'Table'.

I F0108 ligger der både tal og tekst, men tallene ligger først og af dem skal jeg bruge de 13 første. Hvis de 13 første ikke er tal, men måske 4 tal og noget tekst så skal jeg ikke bruge tallet. F0108 er nvarchar og txt13 er bigint

Håber i kan hjælpen

Mvh
Thomas
Avatar billede arne_v Ekspert
06. januar 2010 - 20:08 #1
Der er ingen FROM i UPDATE !
Avatar billede arne_v Ekspert
06. januar 2010 - 20:09 #2
Hm. Ordet tabel optraeder ikke i SQL'en - er det den rigtige SQL ?
Avatar billede faithless Praktikant
06. januar 2010 - 20:15 #3
Hej Arne

From står i 3. linie i koden.

Jeg forstod heller ikke helt fejl beskeden, men det er den rigtige kode. Jeg tror problemet ligger i syntaxen på Convert, da jeg har kørt alt det andet uden problemer før.

CONVERT(bigint,left(CT_Data.dbo.CT_data.F0108,13))
Avatar billede faithless Praktikant
06. januar 2010 - 20:20 #4
Har lige prøvet en select

SELECT CONVERT(bigint, left(CT_Data.dbo.CT_data.F0108,13)) FROM CT_Data.dbo.CT_data

Får fejlen
Error converting data type nvarchar to bigint.
Avatar billede HenrikSjang Nybegynder
06. januar 2010 - 21:08 #5
Prøv at køre denne select:
SELECT left(CT_Data.dbo.CT_data.F0108,13) FROM CT_Data.dbo.CT_data

En af disse rækker kan ikke konverteres til en bigint, og det er roden til problemet.
Avatar billede HenrikSjang Nybegynder
06. januar 2010 - 21:19 #6
Sorry, missede lige din besked om at disse rows fx godt kan indeholde først 4 tal og derefter andre tegn.

Jeg ville overveje at putte en where klausul på, og kalde isnumeric functionen på de 13 første tegn. NOget i stil med:

SELECT CONVERT(bigint, left(CT_Data.dbo.CT_data.F0108,13)) FROM CT_Data.dbo.CT_data
where isnumeric(left(CT_Data.dbo.CT_data.F0108,13)) = 1

(jeg kan ikke lige huske om isnumeric returnerer et 0 eller 1, eller om den returnerer true/false. Muligvis skal du fjerne = 1 til sidst)

isnumeric er desværre ikke helt bulletproof, så alt efter hvad dit kildemateriale kan bestå af er det ikke godt nok at bruge den. Et tal som 1.1 vil nemlig også være numeric ifølge den function. Så hvis din kolonne godt kan indeholde fx 1234.123123123 så vil isnumeric returnere true, men din convert til bigint vil fejle. Men hvis det altid vil være 1234ABCDEFG, så vil det virke.
Avatar billede faithless Praktikant
06. januar 2010 - 22:05 #7
Du har ret, der kan godt være 1.5 osv blandt de tal. Er der nogen måde at jeg kan få det der er bigint, af de 13 første over i den anden kolonne og den bare smide resten væk?

Min tabel er på 5,6 mil rekords og dette omhandler ca 150000 af dem.

Min original sp ser ud som nedenfor og den sortere fint teksten fra.

UPDATE CT_Data.dbo.CT_data
SET CT_Data.dbo.CT_data.txt13 = left(CT_Data.dbo.CT_data.F0108,13)
FROM CT_Data.dbo.CT_data
WHERE CT_Data.dbo.CT_data.F0136 is null and isnumeric(left(CT_Data.dbo.CT_data.F0108,13)) =1
Avatar billede faithless Praktikant
07. januar 2010 - 07:23 #8
Kan man lave noget i stil med "On Error Resume next"?
Avatar billede HenrikSjang Nybegynder
07. januar 2010 - 08:48 #9
Jeg har lavet min egen udgave af "isNumeric". Den kigger på om input strengen indeholder tal fra 0-9 eller andre tegn - og hvis den kun indeholder tal fra 0-9, så returnerer den 1, ellers 0. Den burde virke sammen med min forrige konstruktion.

Funktionen ser sådan ud:

CREATE FUNCTION [dbo].[udf_IsNumeric]
(
    -- String to be tested - leading and trailing spaces are trimmed
    @strINT        varchar(50)
)
RETURNS int
AS

BEGIN
    DECLARE    @intValue int
    SELECT    @strINT = LTRIM(RTRIM(@strINT)),
        @intValue = CASE WHEN @strINT NOT LIKE '%[^0123456789]%' AND CAST(@strINT AS BIGINT) <= 2147483648
            THEN 1
            ELSE 0
            END
    RETURN @intValue
END
Avatar billede HenrikSjang Nybegynder
07. januar 2010 - 08:49 #10
og til dit spørgsmål omkring "on error resume next", så er svaret vel et eller andet sted både ja og nej. Man kan ikke gøre det i et set-based operation, men hvis man gør det unævnelige, og i stedet looper alle rows igennem med en cursor - så vil man kunne lave fejl-håndtering pr. row. Det vil dog nok performe ret ringe.
Avatar billede faithless Praktikant
07. januar 2010 - 08:55 #11
Hej sjang

Tak for hjælpen. Jeg kigger på din egen isnumeric senere, når sql experten på mit arbjde kommer.
Kan du ikke smide et svar, så ser jeg om jeg kan finde ud af at gi dig point i det nye layout (c:
Avatar billede HenrikSjang Nybegynder
08. januar 2010 - 18:05 #12
Håber du fik det til at spille. Her er i hvert fald et svar.
Avatar billede faithless Praktikant
09. januar 2010 - 13:51 #13
Ja tak. Jeg brugte din funktion og beholdte data typen som tekst.
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



IT-JOB