sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan indsætter du resultaterne af en lagret procedure i en midlertidig tabel i SQL Server

I nogle tilfælde med SQL Server kan der være et tilfælde, hvor du ønsker at tage de resulterende data fra en lagret procedure og indsætte dem i en midlertidig tabel til brug i en anden forespørgsel. Det kan være lidt svært at bestemme, hvordan denne opgave skal udføres, så vi vil kort skitsere et par muligheder, afhængigt af dine specifikke behov og databasekonfiguration.

Før vi undersøger de specifikke metoder, lad os lave en eksempelprocedure. Selvom det ikke er særlig nyttigt, lad os oprette BooksByPrimaryAuthor procedure, som accepterer @PrimaryAuthor parameter og henter poster fra vores books tabel, hvor den @PrimaryAuthor Tændstikker. Proceduregenereringserklæringen kan se sådan ud:

CREATE PROC BooksByPrimaryAuthor
  @PrimaryAuthor nvarchar(100)
AS
BEGIN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
END
GO

Ideelt set er det, vi gerne vil gøre, noget som dette, hvor vi SELECT de resulterende data fra vores procedure og indsæt dem i en midlertidig tabel:

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  EXEC BooksByPrimaryAuthor 'Tolkien'

Problemet er ovenstående syntaks er forkert og vil ikke fungere . Vi har brug for en ny metode.

Brug af OPENROWSET-erklæringen

En mulighed er at bruge OPENROWSET sætning, som giver dig adgang til fjerndata fra en OLE DB-kilde og kan udføres direkte fra en anden SQL-sætning. OPENROWSET er en engangsforbindelse og datahentningsmetode, så den bør ikke bruges til hyppige forbindelser (tilknytning af servere er at foretrække i så fald).

OPENROWSET kan være målet for enhver INSERT , DELETE eller UPDATE erklæring, hvilket gør den ideel til vores formål at "udføre" vores lagrede procedure for os og udtrække disse data tilbage til vores ventende midlertidige bord.

Før du bruger OPENROWSET , kan det være nødvendigt at ændre nogle konfigurationsmuligheder, specifikt ved at tillade ad hoc-adgang. Dette kan konfigureres ved hjælp af følgende udsagn:

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

Nu kan vi bruge OPENROWSET , som har en bestemt syntaks, der skal overholdes:

OPENROWSET(
  <PROVIDER_NAME>,
  <DATA_SOURCE>,
  <OPTIONS>
)

Derfor kan vi udføre vores lagrede procedure gennem OPENROWSET og send det til vores midlertidige bord sådan:

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  OPENROWSET(
    'SQLNCLI',
    'Server=(local)\SQL2008;Trusted_Connection=yes;',
    'EXEC BooksByPrimaryAuthor Tolkien'
)

Du skal muligvis ændre PROVIDER_NAME og DATA_SOURCE værdier til dine egne formål.

Brug af en brugerdefineret funktion

Der er et par ulemper ved OPENROWSET metode, nemlig at den kræver ad hoc tilladelser/konfiguration som vi så ovenfor, og også OPENROWSET er kun i stand til at returnere et enkelt resultatsæt (hvis der er angivet flere sæt, returneres kun det første resultatsæt).

Derfor er en anden metode til at udføre denne opgave effektivt at erstatte den lagrede procedure med en brugerdefineret funktion i stedet for.

Fra vores eksempel ville det se sådan ud:

CREATE FUNCTION BooksByPrimaryAuthor
(
  @PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
GO

Denne funktion kan så bruges nogenlunde på samme måde som ønsket ovenfor ved hjælp af OPENROWSET :

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  BooksByPrimaryAuthor('Tolkien')

I tilfælde af at du virkelig har brug for en lagret procedure, kan du også pakke din funktion ind i en lagret procedure.


  1. Find poster, hvor join ikke findes

  2. Forskellen mellem #temptable og ##Temptable?

  3. SQLSTATE[HY000] [1045] Adgang nægtet for brugeren 'brugernavn'@'localhost' ved hjælp af CakePHP

  4. node.js async/await bruger med MySQL