IsNumeric

Pozdrav,

danes sem ugotovil, mogoce malo pozno :0)), da:

ISNUMERIC returns 1 when the input expression evaluates to a valid integer, floating point number, money or decimal type; otherwise it returns 0. A return value of 1 guarantees that expression can be converted to one of these numeric types.

ne drzi cisto. Za izpis napačno vnešenih davnčnih razbijem davnčno na 8 številk in  izračunam kontrolko.

Dokler ni en od uporabnikov vpisal v davčno številko vejic je izpis delal bp.

Primer:

declare @TaxId char(8)
set @TaxId='87,96,44'

select 11-(((8*convert(int,substring(@TaxId,1,1)) +
    7*convert(int,substring(@TaxId,2,1)) +
    6*convert(int,substring(@TaxId,3,1)) +
    5*convert(int,substring(@TaxId,4,1)) +
    4*convert(int,substring(@TaxId,5,1)) +
    3*convert(int,substring(@TaxId,6,1)) +
    2*convert(int,substring(@TaxId,7,1))) % 11 )) as ControlCalc,
    substring(@TaxId,8,1) as ControlNum
where
IsNumeric(substring(@TaxId,1,1))=1
and IsNumeric(substring(@TaxId,2,1))=1
and IsNumeric(substring(@TaxId,3,1))=1
and IsNumeric(substring(@TaxId,4,1))=1
and IsNumeric(substring(@TaxId,5,1))=1
and IsNumeric(substring(@TaxId,6,1))=1
and IsNumeric(substring(@TaxId,7,1))=1
and IsNumeric(substring(@TaxId,8,1))=1

 

jasno je bilo da v where nekaj ne stima in poskusil sem 

select isNumeric(',') in dobil 1  :0((

Ali to tako je ali sem spregledal kakšno nastavitev? Kakšna ideja kako bi zdaj tale where postimal, da mi ne bo potrebno

pisati za vsak znak, ki dela IsNumeric tezave (tudi pika recimo),  where substring(@TaxId,1,1) not in(',','.') itd....

 

Hvala za ideje

Tomaž 

 

 


 

Avtor: tomaz_sres, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

petar.repac
petar.repac - petek, 22. junij 2007

osebno ne maram videti da se direktno dostopa do baznih tabel, to naj dela DBAzato raje naredim view in potem klientu dam read pravice nad view-jem,selecti iz kode pa berejo iz view-jaje nekaj dodatnega dela na bazi, vendar ima tudi nekaj prednosti 

spirit1
spirit1 - petek, 22. junij 2007

tako je. s pravilnio parametirzacijo sql-a se izognes sql injection-u.je pa res da ima lahko sql grajen v kodi probleme s pravicami. moras dati read pravice na vsako tabelo, ki jo uporabljasv primerjavi s sproci kjer moras user-ju dati samo execute pravice nanjo. ce ti pravice niso ovira je za kompleksna iskanja ponavadi boljsi kar dinamicen sql.

tomaz_sres
tomaz_sres - četrtek, 21. junij 2007

Hvala, bo dosti tudi insert :0)). Zanimiv pristop, bom dal na test oba nacina na kakem bolj je.... selectu, predvsem v upanju,da se sp nacin pokaze primerljivo hiter. sp so mi namrec zelo fajn predvsem zato,ker ni potrebno prevajat klienta za vsako spremembo v poizvedbi in ker imam tako red,saj je vsa koda sql-a je v bazi in nikjer drugje. Ce sem pravilno razumel primer, je podobno kotsp varen pred posiljanjem nevarne sql kode na streznik? 

MihaM
MihaM - četrtek, 21. junij 2007

Glih to imam pri roki. Ni ravno select, je pa dinamičen  using (SqlConnection conn = new SqlConnection(connectionString))            using (SqlCommand cmd = new SqlCommand(@"INSERT INTO Tracking (InstanceId, ActivityId, UserName, ActivityName, ActionType, IsTimeout) VALUES(@InstanceId, @ActivityId, @UserName, @ActivityName, @ActionType, @IsTimeout)", conn))            {                cmd.Parameters.AddWithValue("@InstanceId", parameters.InstanceId);                cmd.Parameters.AddWithValue("@ActivityId", activityId);                cmd.Parameters.AddWithValue("@UserName", user == null ? DBNull.Value: (object)user);                cmd.Parameters.AddWithValue("@ActivityName", activityName);                cmd.Parameters.AddWithValue("@ActionType", actionType.ToString());                cmd.Parameters.AddWithValue("@IsTimeout", isTimeout);                conn.Open();                cmd.ExecuteNonQuery();            }

tomaz_sres
tomaz_sres - četrtek, 21. junij 2007

A mi lahko das kak enostaven primer dinamicnega parametriziranega sql-a za iskanje? T 

spirit1
spirit1 - sreda, 20. junij 2007

mogoce pri iskanju ne bi bilo slabo imeti dinamicnega pravilno parametriziranega sql-a.zna biti velikokrat hitrejsi od ene stored procedure. in pa z if-i v sprocih lahko dobis neoptimalne execution plane za razlicne kombinacije iskalnih polj.

tomaz_sres
tomaz_sres - sreda, 20. junij 2007

Problem je v osnovi "politicen", da je po eni strani TaxId "najbolj pomemben" podatek v bazici po drugi pa ne smem omejevatinapacnih vnosov cez izmenjave podatkov, ker je kao vazno, da dobimo podatke pozneje jih bodo ze popravili :0)).Jaz sem se navadil dela z sp in to neglede ali gre za select, insert, update, delete in to seveda po prarametrih ustreznega tipa.Nikoli ne uporavljam parsanih sql stavkov tudi ne pri kompleksnih iskanjih. Ko res ne gre drugace uporabim raje if v sp Torej bo vsaj IsDate ostal v uporabi :0))T   

spirit1
spirit1 - sreda, 20. junij 2007

input lahko zelo enostavno resis z check constraintom na stolpcu.IsDate nima nobenih presenecenj. deluje tocno tako kot je bapisano v BOL-u je pa odvisen od dateformat-a in jezikovnih nastavitev.ker pa itak vse datume insertiras prek parametrov in NE kot stringe v bazo s tem ne bos imel problemov.sej imas parametrizirane SQL Stavke, ne?

tomaz_sres
tomaz_sres - sreda, 20. junij 2007

Na klientu imam kontrole, problem je ker bazo filajo se z n mnogo direkt dostopi.Zato sem pa naredil izpis napacno vnesenih davcnih, da jih potem v klientu na roke popravljajo. :0))  Dokoncno si mi pokvaril veselje glede uporabe IsNumeric :0)) Ali ima tudi IsDate kaka presenecenja? 

tomaz_sres
tomaz_sres - sreda, 20. junij 2007

To pa dost lepse zgleda, thx.T 

spirit1
spirit1 - sreda, 20. junij 2007

uporabi raje like:DECLARE @taxNum VARCHAR(20)SELECT @taxNum = '123433h2'SELECT 1WHERE @taxNum NOT LIKE '%[^0-9]%'SELECT @taxNum = '1234332'SELECT 1WHERE @taxNum NOT LIKE '%[^0-9]%'

tomaz_sres
tomaz_sres - sreda, 20. junij 2007

Tako ja, jaz rabim tip integer, ki je lahko od 0-9. Za tip integer convert vejice vrne error, ceprav v dokumentaciji pise, da je podprt tudi integer.No, trenutno sem zadevo resila z:substring(taxid,1,1) in ('0','1','2','3','4','5','6','7','8','9') v where Se strinjam, dalo bi se zadevo lepse napisat, sam gre za izsek iz select stavka.l.p.T   

spirit1
spirit1 - sreda, 20. junij 2007

uporabi validacijo na klientu, da ne dovoli vejc. v sprocu pa lahko komot zamenjas vejce s praznim stringomselect  replace(@yourVar, ',', '') in pa isNumeric ni tako simpl kot izgleda je odvisen od collation-aSELECT ISNUMERIC('1234d32'), ISNUMERIC('1234e32'), ISNUMERIC('1234,32'), ISNUMERIC('1234.32') in pa ne smes pozabit na e in d, ki pomenita exponentni in decimalni zapis

petar.repac
petar.repac - sreda, 20. junij 2007

SELECT CONVERT(money, ',') AS VEJCA_AS_MONEY FROM MyTabledobimVEJCA_AS_MONEY        --------------------- .0000.0000.0000(3 row(s) affected)Tako da izgleda da stavek iz dokumentacije drži.Ti zgleda predpostavljaš da če IsNumeric za en karakter vrne 1 potem je noter cifra 0 do 9.Ta predpostavka očitno ne drži. BTW, a ne bi bilo lepše če bi ti logiko, ki jo imaš za izračun kolone in tisto v where  klavzuli prestavil v kakšne stored funkcije/procedure ? LP, Petar