Jos on – valitse Estä toistuva koodi

Saamme tilausluettelon ja vahvistamme, että se alkaa tietyillä etuliitteillä, esimerkiksi jos Tilausnumero ei ala ABC: llä, kuin näyttö tilauslista käyttäjälle virheenä. Käytämme olemassaoloa, etsimme ensimmäistä olemassaoloa, emme halua kuluttaa paljon esitysaikaa. Jos sellaista ei ole, voimme aloittaa toisen tehtävän suorittamisen koodilla.

Onko sql: ssä silti eroon toistuva koodi? Meillä on useita tällaisia tarkistuksia useissa taulukoissa, jotka yrittävät tehdä koodista tehokkaampaa.

if exists ( select * from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" ) begin select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" end else 

Vastaa

Valitettavasti pelkään yrittämällä estää koodin toistamisen, saatat päätyä kirjoittamaan enemmän koodia ja tekemään kyselystä vähemmän luettavan. Mutta uskon, että tämä voi olla sinulle hyödyllistä – ota huomioon tilanteet, joissa testissä joudut etsimään vain yhdestä tai kahdesta taulukosta, joissa sinun on liitettävä kaikki muut yksityiskohdat saadaksesi lisää. Tällaisissa tilanteissa voit yksinkertaistaa testikyselyä ja siten nopeuttaa niiden suorittamista.

Ja kun olemme siinä, voit myös harkita WHERE-käskyn muuttamista. Funktioiden käyttäminen predikaatissa ei tee niistä SARGable ja estää indeksien käytön näissä tapauksissa. Parempi lähestymistapa tässä esimerkissä olisi tarkistaa

WHERE OrderNumber LIKE "ABC%" 

koska optimoija suorittaa muunnoksen joksikin mallista

OrderNumber >= "ABC" AND OrderNumber < "ABD" 

joka tukee hakemistojen käyttöä. Joten tämä olisi Indeksiskannaus (käyttämällä vasenta ()) ja Hakuhaku (käyttämällä LIKE).

Vastaa

Valitettavasti useista syistä (ei pelkästään vanhoista) SQL: llä ei ole melkein kaikkia koodin uudelleenkäyttövaihtoehtoja ja -ominaisuuksia, jotka useimmilla asiakaskielillä on, ja joillakin niistä (kuten skalaariset UDF: t) on merkittäviä ongelmia. Joten jos haluat olla tehokas SQL-ohjelmoija, sinun on suostuttava tekemään paljon enemmän leikkaus- ja liittämiskoodin uudelleenkäyttöä kuin mitä ikinä ajattelisit asiakkaan kielellä, kuten C #, VB. Net tai Java.

Siitä huolimatta voit poistaa redundanssin esimerkissäsi. Sinun on kuitenkin päätettävä, onko se todella parempi vai ei.

Declare @OrderErrorList Table(OrderNumber varchar(32)); Insert into @OrderErrorList select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC"; if exists ( select * from @OrderErrorList ) begin select * from @OrderErrorList end else 

kommentit

  • Voisitko yksinkertaistaa tätä tarkentamalla tarkistamalla @@ ROWCOUNT olemassa olevan sijasta?
  • @mathewb Kyllä, mutta se on tehtävä heti INSERT..VALIT. Jos lisäät toisen lausunnon, se lakkaa yhtäkkiä toimimasta oikein ja yritän välttää vastauksissani tällaisia maamiinoja. Kiertotapa olisi tallentaa @@ ROWCOUNT muuttujaan, mutta silloin se ei olisi merkittävästi parempi kuin mitä minulla on yllä.

Vastaa

Onko sql-tiedostossa päästä eroon toistuvasta koodista?

Ei oikeastaan, ei. Voit muotoilla kyselyn uudelleen tällä tavalla ilman IF-käskyä, mutta se ei todellakaan eroa sinulla olevasta:

SELECT * FROM dbo.OrdersImport o WHERE LEFT(OrderNumber, 3) <> "ABC" AND EXISTS ( SELECT * FROM dbo.OrdersImport WHERE LEFT(OrderNumber,3) <> "ABC" AND ID = o.ID ) 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *