Rendelési listát kapunk, és érvényesítjük bizonyos előtagokkal, például ha a OrderNumber nem ABC-vel kezdődik, akkor rendelési lista a felhasználónak hibaként. A létezőket használjuk az első létezés keresésére, és nem akarunk sok előadási időt felvenni. Ha ilyen nincs, akkor elkezdhetünk más feladatokat végrehajtani kódban. az ismétlődő kód? Sok ilyen ellenőrzés van több táblán, és megpróbáljuk hatékonyabbá tenni a kódot.
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
Válasz
Sajnos attól tartok, hogy megpróbálom megakadályozni a kód megismétlését, végül több kódot írhat, és a lekérdezést kevésbé olvashatóvá teszi. De úgy gondolom, hogy ez előnyös lehet az Ön számára – vegye figyelembe azokat a helyzeteket, amikor a teszt során csak egy vagy két táblázatban kellene keresnie, ahol az összes részlet megszerzéséhez még többhez kell csatlakoznia. Ezekben a helyzetekben egyszerűsítheti a tesztlekérdezést, ezáltal gyorsabban végrehajtva őket.
És amíg itt tartunk, fontolóra veheti a WHERE utasítás megváltoztatását is. A függvények használata az predikátumban nem teszi őket SARGable-vé, és megakadályozza az indexek használatát ilyen esetekben. Jobb megközelítés ebben a példában a
WHERE OrderNumber LIKE "ABC%"
ellenőrzése lenne, mivel az optimalizáló átalakítja valamivé a következőt:
OrderNumber >= "ABC" AND OrderNumber < "ABD"
amely támogatja az indexek használatát. Tehát ez az Index keresés (a left () használatával) az Index kereséssel (a LIKE használatával).
Válasz
Sajnos különféle okokból (nem csak örökölt) az SQL nem rendelkezik szinte minden olyan kód újrafelhasználási lehetőséggel és funkcióval, amely a legtöbb kliensnyelv rendelkezik, és némelyikük (például a skaláris UDF-ek) jelentős problémákkal küzd. Tehát nagyrészt, ha hatékony SQL programozó akarsz lenni, akkor le kell mondanod magadról, hogy sokkal több kivágott és beillesztett kódot használsz fel újra, mint amit valaha is figyelembe vennél egy olyan ügyfélnyelven, mint a C #, VB. Net vagy Java.
Ennek ellenére kiküszöbölheti a redundanciát a példájában, azonban el kell döntenie, hogy ez valóban jobb-e vagy sem.
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
megjegyzések
- Tudná egyszerűsíteni ezt azzal, hogy a @@ ROWCOUNT ellenőrzi, nem pedig létezik?
- @mathewb Igen, de azonnal az INSERT..SELECT után kell megtenni. Ha hozzáad egy újabb állítást, akkor az hirtelen abbahagyja a helyes működést, és válaszaimban megpróbálom elkerülni az ilyen szárazföldi aknákat. A megoldás az lenne, ha a @@ ROWCOUNT értéket elmentenénk egy változóba, de akkor ez nem lenne lényegesen jobb, mint amivel fentebb rendelkezem.
Válasz
Van-e különben is sql-ben megszabadulni az ismétlődő kódtól?
Nem igazán, nem. Ilyen módon fogalmazhatja meg újra a lekérdezést az IF utasítás nélkül, de valójában nem különbözik attól, amivel rendelkezik:
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 )