Har du någonsin kört en lagrad procedur, bara för att bli överväldigad av antalet kolumner som returneras? Kanske behövde du bara en eller två kolumner, men det gav dig väg för många kolumner för dina behov vid detta speciella tillfälle.
Lyckligtvis finns det ett litet knep du kan använda för att hämta valda kolumner från en lagrad procedur. Detta gör att du kan få precis de kolumner du behöver.
Och det bästa är att det inte innebär att man behöver skapa tillfälliga tabeller och blanda runt data.
Allt du behöver göra är att skicka din lagrade procedur till OPENROWSET()
fungera.
Samma koncept kan tillämpas på OPENQUERY()
funktion.
Exempel
Ta sp_columns
system lagrad procedur till exempel. Den returnerar 19 kolumner.
EXEC sp_columns Cats;
Resultat:
+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | RADIX | NULLABLE | REMARKS | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE | |-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------| | Pets | dbo | Cats | CatId | 4 | int identity | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 1 | NO | 56 | | Pets | dbo | Cats | CatName | 12 | varchar | 60 | 60 | NULL | NULL | 1 | NULL | NULL | 12 | NULL | 60 | 2 | YES | 39 | +-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
Tillvägagångssätt som detta kräver ofta att vi rullar i sidled i en vild jakt för att hitta de kolumner vi är intresserade av.
Kanske vill vi bara se 4 specifika kolumner istället för alla 19.
Vi kan köra följande fråga för att göra just det.
SELECT
c.COLUMN_NAME,
c.TYPE_NAME,
c.PRECISION,
c.LENGTH
FROM OPENROWSET(
'SQLOLEDB',
'SERVER=localhost;Trusted_Connection=yes;',
'EXEC Pets.dbo.sp_columns Cats'
) c;
Resultat:
+---------------+--------------+-------------+----------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |---------------+--------------+-------------+----------| | CatId | int identity | 10 | 4 | | CatName | varchar | 60 | 60 | +---------------+--------------+-------------+----------+
OPENROWSET()
Funktionen designades huvudsakligen för att hämta fjärrdata, men du kan också använda den på den lokala instansen genom att ange localhost
i anslutningssträngen (som jag har gjort i det här exemplet).
OPENQUERY()-funktionen
Som nämnts kan samma koncept tillämpas på OPENQUERY()
funktion.
SELECT
c.COLUMN_NAME,
c.TYPE_NAME,
c.PRECISION,
c.LENGTH
FROM OPENQUERY(
Homer,
'EXEC Pets.dbo.sp_columns Cats'
) c;
Resultat:
+---------------+--------------+-------------+----------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |---------------+--------------+-------------+----------| | CatId | int identity | 10 | 4 | | CatName | varchar | 60 | 60 | +---------------+--------------+-------------+----------+
I det här fallet angav jag en länkad server som heter Homer
istället för den lokala servern.
Om du får ett felmeddelande som säger "Server är inte konfigurerad för DATAÅTKOMST", måste du aktivera dataåtkomst för servern, även om du frågar efter din lokala instans. Se Hur du aktiverar/inaktiverar dataåtkomst för instruktioner om hur du gör detta.