06. januar 2010 - 20:04Der 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
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.
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.
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
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
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.
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:
Ja tak. Jeg brugte din funktion og beholdte data typen som tekst.
Synes godt om
Ny brugerNybegynder
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.