sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man infogar resultaten av en lagrad procedur i en tillfällig tabell i SQL Server

I vissa fall med SQL Server kan det finnas ett fall där du vill ta den resulterande informationen från en lagrad procedur och infoga den i en temporär tabell för användning i en annan fråga. Det kan vara lite svårt att avgöra hur man ska utföra denna uppgift, så vi ska kortfattat beskriva ett par alternativ, beroende på dina specifika behov och databaskonfiguration.

Innan vi undersöker de specifika metoderna, låt oss skapa en exempelprocedur. Även om det inte är särskilt användbart, låt oss skapa BooksByPrimaryAuthor proceduren, som accepterar @PrimaryAuthor parameter och hämtar poster från våra books tabell där @PrimaryAuthor tändstickor. Procedurgenereringssatsen kan se ut så här:

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

Helst är det vi skulle vilja göra något sånt här, där vi SELECT den resulterande informationen från vår procedur och infoga den i en tillfällig tabell:

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  EXEC BooksByPrimaryAuthor 'Tolkien'

Problemet är syntaxen ovan är felaktig och fungerar inte . Vi behöver en ny metod.

Använda OPENROWSET-satsen

En möjlighet är att använda OPENROWSET sats, som låter dig komma åt fjärrdata från en OLE DB-källa och kan köras direkt från en annan SQL-sats. OPENROWSET är en metod för engångsanslutning och datahämtning, så den bör inte användas för frekventa anslutningar (att länka servrar är att föredra i så fall).

OPENROWSET kan vara målet för vilken INSERT som helst , DELETE , eller UPDATE uttalande, vilket gör det idealiskt för våra syften att "exekvera" vår lagrade procedur åt oss och extrahera dessa data tillbaka till vårt väntande tillfälliga bord.

Innan du använder OPENROWSET , kan det vara nödvändigt att ändra vissa konfigurationsalternativ, särskilt genom att tillåta ad hoc-åtkomst. Detta kan konfigureras med hjälp av följande satser:

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

Nu kan vi använda OPENROWSET , som har en viss syntax som måste följas:

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

Därför kan vi utföra vår lagrade procedur genom OPENROWSET och skicka det till vårt tillfälliga bord så här:

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

Du kan behöva ändra PROVIDER_NAME och DATA_SOURCE värden för dina egna syften.

Använda en användardefinierad funktion

Det finns några nackdelar med OPENROWSET metod, nämligen att den kräver ad hoc-behörigheter/konfiguration som vi såg ovan, och även OPENROWSET kan endast returnera en enda resultatuppsättning (om flera uppsättningar tillhandahålls returneras endast den första resultatuppsättningen).

Därför är en annan metod för att utföra denna uppgift att effektivt ersätta den lagrade proceduren med en användardefinierad funktion istället.

Från vårt exempel skulle det se ut ungefär så här:

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

Denna funktion kan sedan användas ungefär på samma sätt som önskat ovan med OPENROWSET :

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

Om du verkligen behöver en lagrad procedur kan du också lägga in din funktion i en lagrad procedur.


  1. MySQL välj koordinater inom räckvidd

  2. Hur man får alla tabeller som har en primär nyckelbegränsning skapad i SQL Server Database - SQL Server / TSQL Tutorial 57

  3. Hur man läser MySQL binära loggfiler (BinLog) med mysqlbinlog

  4. Skickar xml-strängparameter till SQL Server-lagrad procedur