Minulla on tallennettu proc spGetSites, joka palauttaa kolme saraketta kohteille SiteName, SiteId ja UnitCount. Tallennettu proc toimii täydellisesti. Yritän tallentaa tallennetun proc-tuloksen temp-taulukkoon @Site käytettäväksi raportissani alla olevan syntaksin kanssa. Tällä kertaa sain virheilmoituksen: ”INSERT EXEC -käskyä ei voida sisäkkäin”

Enkö voi käyttää INSERT- ja EXEC-käskyjä samanaikaisesti?

DECLARE @Site TABLE (SiteName VARCHAR(100), SiteId INT, UnitCount INT) INSERT INTO @Site EXEC spGetSites @SiteId = 0 

Kommentit

  • Sinun tulisi , dbfiddle.uk/… Lisää kysymykseen tallennettu menettely ja merkitse SQL Server -versio.

vastaus

Jos tarkastelet spGetSites menettely, jossain siinä menettelyssä on toinen INSERT...EXEC. Se voi olla suoraan kyseisessä menettelyssä tai sisäkkäin jossakin muussa kutsumassaan menettelyssä.

Viime kädessä jos tallennettu menettely käyttää INSERT...EXEC, niin jos yrität kutsua kyseistä tallennettua menettelyä toisen INSERT...EXEC yhteydessä, saat virheilmoituksen nähdä .

Kuinka korjaan sen?

  1. Voit yksinkertaisesti ottaa sisäisen INSERT...EXEC ja liittää koodin tähän yksi tallennettu menettely. Epäilen, että jokin muu menettely voi olla syystä: ts. Pitää koodi kuivana.

  2. Koska tämä on Get menettely, toivottavasti missään puhelupinossa ei tapahdu datan manipulointia. Voit muuntaa alimenettelyn taulukkoarvoiseksi funktioksi. Tämän avulla voit muuntaa sisäisen INSERT...EXEC INSERT...SELECT -sarjaan ja ratkaise tämä ongelma.

  3. Käytä dataa välittämään menettelyjen välillä käyttämällä ulkoiseen menettelyyn määriteltyjä taulukoita. Tämä ratkaisu saa monimutkainen, joten se ei ole suosikkini, ja suosittelen yleensä tätä mallia, kun on parempi vaihtoehto – mutta täydellisyyden vuoksi sisällytän sen tähän. Pohjimmiltaan, jos luot #temp-taulukon spGetSites -alueen ulkopuolelle, voit käyttää sitä spGetSites -tilassa (luomatta sitä sisälle) ja taulukkoa lisättyjen tietojen kanssa selviää menettelyn suorittamisesta ja jatkaa työtä.

En pidä vaihtoehdosta 3, koska se on tarpeeksi monimutkainen koodausmalli varmistaakseen, että joku sekoittaa sen tulevaisuudessa, paitsi jos kaikki ovat aluksella ja tuntevat koodauksen kuvio: * spGetSites epäonnistuu, ellet luo taulukkoa ensin. Kaikkien soittajien on muistettava luoda taulukko täsmälleen sama ensin. * spGetSites ei voi olettaa, että taulukko on tyhjä. Siinä voi olla olemassa tietoja ulkoisesta puhelusta (tai saman soittajan aikaisempi suoritus) * Vianmääritys ja virheenkorjaus (ja jopa kyselysuunnitelma) kohteelle spGetSites on monimutkaisempi taulukon luomisen sekaannuksen takia.

Mitä tekisin?

Tietämättä kuinka monimutkainen koodi on spGetSites takana, etsin luoda TVF: n, joka korvaa sisäisen INSERT...EXEC koodilla INSERT...SELECT tai mahdollisesti kaikki kohdat spGetSites voitaisiin yksinkertaistaa / kirjoittaa uudelleen itsenäiseksi ilman INSERT...EXEC

Vastaa

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