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ž
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 - 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 - č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 - č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 - četrtek, 21. junij 2007
A mi lahko das kak enostaven primer dinamicnega parametriziranega sql-a za iskanje? T
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 - 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 - 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 - 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 - sreda, 20. junij 2007
To pa dost lepse zgleda, thx.T
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 - 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 - 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 - 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