EXECUTE (Transact-SQL)
Esegue una stringa di comando o una stringa di caratteri all'interno di un batch di comandi Transact-SQL oppure uno dei moduli seguenti: stored procedure di sistema, stored procedure definita dall'utente, funzione con valori scalari definita dall'utente o stored procedure estesa.
Nota sulla sicurezza |
---|
Prima di chiamare l'istruzione EXECUTE con una stringa di caratteri, convalidare la stringa di caratteri. Non eseguire mai un comando costruito in base a input utente non convalidato. Per ulteriori informazioni, vedere Attacco intrusivo nel codice SQL. |
SQL Server estende la funzionalità dell'istruzione EXECUTE in modo da poterla utilizzare per inviare comandi pass-through a server collegati. Inoltre, è possibile impostare in modo esplicito il contesto di esecuzione di una stringa o un comando.
Sintassi
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH RECOMPILE ]
}
[;]
Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[;]
Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
[ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
)
[ AS { LOGIN | USER } = ' name ' ]
[ AT linked_server_name ]
[;]
Argomenti
@return_status
Variabile di tipo integer facoltativa in cui viene archiviato lo stato di restituzione di un modulo. Prima di utilizzare questa variabile in un'istruzione EXECUTE, è necessario dichiararla nel batch, nella stored procedure o nella funzione.Quando viene utilizzata per richiamare una funzione a valori scalari definita dall'utente, la variabile @return_status può essere rappresentata da qualsiasi tipo di dati scalare.
module_name
Nome completo o non qualificato della stored procedure o della funzione con valori scalari definita dall'utente da chiamare. I nomi di modulo devono essere conformi alle regole per gli identificatori. Per i nomi delle stored procedure estese la combinazione di maiuscole e minuscole è sempre rilevante, indipendentemente dalle regole di confronto del server.Un modulo che è possibile creare in un altro database può essere eseguito se l'utente che lo esegue è il proprietario del modulo o dispone delle autorizzazioni appropriate per eseguirlo in tale database. È possibile eseguire un modulo in un altro server che esegue SQL Server se l'utente che lo esegue dispone delle autorizzazioni appropriate per l'utilizzo di tale server (accesso remoto) e per l'esecuzione del modulo nel database specifico. Se si specifica il nome del server ma non quello del database, Motore di database di SQL Server esegue automaticamente la ricerca del modulo nel database predefinito dell'utente.
;number
Numero intero facoltativo utilizzato per raggruppare le procedure con lo stesso nome. Questo parametro non viene usato per stored procedure estese.Nota
Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa caratteristica in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.
Per ulteriori informazioni sui gruppi di procedure, vedere CREATE PROCEDURE (Transact-SQL).
@module_name_var
Nome di una variabile definita localmente che rappresenta il nome di un modulo.@parameter
Parametro per module_name, come definito nel modulo. I nomi dei parametri devono iniziare con il simbolo di chiocciola (@). Quando si utilizzano nomi di parametri e costanti nel formato @parameter_name=value, non è necessario immetterli nell'ordine in cui sono definiti nel modulo. Se, tuttavia, il formato @parameter_name=value viene utilizzato per qualsiasi parametro, sarà necessario utilizzare tale formato per tutti i parametri successivi.Per impostazione predefinita, i parametri ammettono valori Null.
value
Valore del parametro da passare al modulo o al comando pass-through. Se i nomi dei parametri vengono omessi, è necessario immettere i relativi valori in base all'ordine definito nel modulo.Durante l'esecuzione di comandi pass-through in server collegati, l'ordine dei valori dei parametri dipende dal provider OLE DB del server collegato. La maggior parte dei provider OLE DB associa i valori ai parametri da sinistra a destra.
Se il valore di un parametro è il nome di un oggetto, una stringa di caratteri o un nome qualificato dal nome del database o dello schema, l'intero nome deve essere racchiuso tra virgolette singole. Se il valore di un parametro è rappresentato da una parola chiave, questa deve essere racchiusa tra virgolette doppie.
Se nel modulo è definito un valore predefinito, l'utente può eseguire il modulo senza specificare un parametro.
Il valore predefinito può essere inoltre NULL. In genere nella definizione del modulo sono specificate le operazioni da eseguire se un valore di parametro è NULL.
@variable
Variabile in cui è archiviato un parametro o un parametro restituito.OUTPUT
Specifica che il modulo o la stringa di comando restituisce un parametro. Il parametro corrispondente nel modulo o nella stringa di comando deve essere creato tramite la parola chiave OUTPUT. Specificare questa parola chiave quando come parametri si utilizzano variabili di cursore.Se value viene definito come OUTPUT di un modulo eseguito su un server collegato, qualsiasi modifica apportata al parametro @parameter corrispondente eseguito dal provider OLE DB verrà ricopiato nella variabile al termine dell'esecuzione del modulo.
Se vengono utilizzati parametri OUTPUT e si desidera utilizzare i valori restituiti in altre istruzioni del batch o del modulo chiamante, il valore del parametro deve essere passato come variabile, ovvero @parameter = @variable. Non è possibile eseguire un modulo specificando la parola chiave OUTPUT per un parametro non definito come parametro OUTPUT nel modulo. Le costanti non possono essere passate al modulo utilizzando la parola chiave OUTPUT. Il parametro restituito richiede il nome di una variabile. Prima di eseguire una procedura, è necessario dichiarare il tipo dei dati della variabile e assegnare un valore.
Se si utilizza l'istruzione EXECUTE in una stored procedure remota oppure si esegue un comando pass-through in un server collegato, i parametri OUTPUT non possono essere di nessuno dei tipi di dati LOB.
I parametri restituiti possono essere di un tipo di dati qualsiasi, tranne i tipi di dati LOB.
DEFAULT
Valore predefinito del parametro, come definito nel modulo. Quando nel modulo è previsto un valore per un parametro privo di valore predefinito ed è stato omesso un parametro o è stata specificata la parola chiave DEFAULT, viene generato un errore.WITH RECOMPILE
Impone la compilazione, l'utilizzo e l'eliminazione di un nuovo piano dopo l'esecuzione del modulo. Se per il modulo è disponibile un piano di query esistente, tale piano rimane nella cache.Utilizzare questa opzione se il parametro fornito è atipico oppure se i dati sono cambiati notevolmente. Questa opzione non viene utilizzata per stored procedure estese. È consigliabile utilizzarla solo quando è strettamente necessario, in quanto si tratta di un'opzione onerosa.
Nota
Non è possibile utilizzare WITH RECOMPILE in caso di chiamata di una stored procedure che utilizza la sintassi OPENDATASOURCE. Quando viene specificato un nome di oggetto composto da quattro parti, l'opzione WITH RECOMPILE viene ignorata.
@string_variable
Nome di una variabile locale. @string_variable può essere un qualsiasi tipo di dati tra char, varchar, nchar o nvarchar. Sono inclusi i tipi di dati (max).[N] 'tsql_string'
Stringa costante. tsql_string può essere di tipo nvarchar o varchar. Se si specifica N, la stringa viene interpretata come tipo di dati nvarchar.AS <context_specification>
Specifica il contesto in cui viene eseguita l'istruzione. Per ulteriori informazioni, vedere Informazioni sul contesto di esecuzione.LOGIN
Specifica che il contesto da rappresentare è un account di accesso. L'ambito di rappresentazione è il server.USER
Specifica che il contesto da rappresentare è un utente nel database corrente. L'ambito di rappresentazione è limitato al database corrente. Un cambio di contesto a un utente del database non eredita le autorizzazioni a livello di server di tale utente.Importante Mentre il cambio di contesto all'utente del database è attivo, qualsiasi tentativo di accesso alle risorse esterne al database comporterà l'esito negativo dell'esecuzione dell'istruzione. Ciò è valido per le istruzioni USE database, le query distribuite e le query che fanno riferimento a un altro database tramite l'utilizzo di identificatori in tre o quattro parti. Per estendere l'ambito del cambio di contesto all'esterno del database corrente, vedere Estensione della rappresentazione di database tramite EXECUTE AS.
'name'
Nome utente o nome account di accesso valido. name deve essere membro del ruolo predefinito del server sysadmin oppure esistere come entità rispettivamente in sys.database_principals o sys.server_principals.name non può essere un account predefinito, ad esempio NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService o NT AUTHORITY\LocalSystem.
Per ulteriori informazioni, vedere Specifica di un nome utente o un nome account di accesso di seguito in questo argomento.
[N] 'command_string'
Stringa costante contenente il comando da passare al server collegato. Se si specifica N, la stringa viene interpretata come tipo di dati nvarchar.[?]
Indica i parametri per i quali vengono specificati i valori nell'<elenco di argomenti> dei comandi pass-through utilizzati in un'istruzione EXEC('…', <elenco di argomenti>) AT <server collegato>.AT linked_server_name
Specifica che command_string viene eseguito in linked_server_name e gli eventuali risultati vengono restituiti al client. linked_server_name deve fare riferimento a una definizione di server collegato esistente nel server locale. I server collegati vengono definiti tramite sp_addlinkedserver.
Osservazioni
È possibile specificare i parametri tramite value o @parameter_name = value. Un parametro non fa parte di una transazione, pertanto se un parametro viene modificato in una transazione per la quale verrà eseguito il rollback, il valore precedente del parametro non verrà ripristinato. Il valore restituito al chiamante corrisponde sempre al valore specificato al termine del modulo.
La nidificazione si verifica quando un modulo ne chiama un altro o quando esegue codice gestito tramite riferimenti a un modulo CLR (Common Language Runtime), un tipo definito dall'utente o una funzione di aggregazione. Il livello di nidificazione viene incrementato quando il modulo chiamato o il riferimento al codice gestito viene eseguito, mentre viene decrementato al termine dell'esecuzione del modulo chiamato o del riferimento al codice gestito. Se viene superato il numero massimo di 32 livelli di nidificazione, l'intera catena di chiamata ha esito negativo. Il livello di nidificazione corrente viene archiviato nella funzione di sistema @@NESTLEVEL.
Poiché le stored procedure remote ed estese non rientrano nell'ambito di una transazione, a meno che non siano eseguite in un'istruzione BEGIN DISTRIBUTED TRANSACTION o utilizzate con diverse opzioni di configurazione, non è possibile eseguire il rollback dei comandi eseguiti tramite chiamate a tali stored procedure. Per ulteriori informazioni, vedere Stored procedure di sistema (Transact-SQL) e BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).
Quando vengono utilizzate variabili cursore, se si esegue una procedura che passa una variabile cursore con un cursore assegnato, viene generato un errore.
Se l'istruzione è la prima di un batch, non è necessario specificare la parola chiave EXECUTE durante l'esecuzione dei moduli.
Utilizzo di EXECUTE con stored procedure
Se l'istruzione è la prima di un batch, non è necessario specificare la parola chiave EXECUTE durante l'esecuzione delle stored procedure.
I nomi delle stored procedure di sistema di SQL Server iniziano con i caratteri sp_. Tali stored procedure vengono fisicamente archiviate nel database Resource, ma sono visualizzate logicamente nello schema sys di ogni database di sistema e di ogni database definito dall'utente. Se si esegue una stored procedure di sistema in un batch oppure all'interno di un modulo quale una stored procedure o una funzione definita dall'utente, è consigliabile qualificare il nome della stored procedure con il nome dello schema sys.
I nomi delle stored procedure estese di sistema di SQL Server iniziano con i caratteri xp_, e tali stored procedure sono incluse nello schema dbo del database master. Se si esegue una stored procedure estesa di sistema in un batch oppure all'interno di un modulo quale una stored procedure o una funzione definita dall'utente, è consigliabile qualificare il nome della stored procedure con master.dbo.
Se si esegue una stored procedure definita dall'utente in un batch oppure all'interno di un modulo quale una stored procedure o una funzione definita dall'utente, è consigliabile qualificare il nome della stored procedure con un nome di schema. Non è consigliabile assegnare a una stored procedure definita dall'utente lo stesso nome di una stored procedure di sistema. Per ulteriori informazioni sull'esecuzione di stored procedure, vedere Esecuzione di stored procedure (Motore di database).
Utilizzo dell'istruzione EXECUTE con una stringa di caratteri
Nelle versioni precedenti di SQL Server le stringhe di caratteri sono limitate a 8.000 byte. Ciò richiede la concatenazione di stringhe di grandi dimensioni per l'esecuzione dinamica. In SQL Server è possibile specificare i tipi di dati varchar(max) e nvarchar(max) in quanto supportano stringhe di caratteri fino a 2 gigabyte di dati.
Le modifiche al contesto del database rimangono effettive solo fino al termine dell'esecuzione di EXECUTE. Dopo l'esecuzione di EXEC nell'istruzione seguente, ad esempio, il contesto del database è master.
USE master; EXEC ('USE AdventureWorks2008R2; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
Cambio di contesto
È possibile utilizzare la clausola AS { LOGIN | USER } = ' name ' per cambiare il contesto di esecuzione di un'istruzione dinamica. Se il cambio di contesto viene specificato come EXECUTE ('string') AS <context_specification>, la durata del cambio di contesto è limitata all'ambito della query in fase di esecuzione. Per ulteriori informazioni, vedere Informazioni sul cambio di contesto.
Specifica di un nome utente o un nome account di accesso
Il nome utente o il nome account di accesso specificato in AS { LOGIN | USER } = ' name ' deve esistere come entità rispettivamente in sys.database_principals o sys.server_principals. In caso contrario, l'istruzione avrà esito negativo. È inoltre necessario concedere le autorizzazioni IMPERSONATE per l'entità. A meno che il chiamante non sia il proprietario del database o un membro del ruolo predefinito del server sysadmin, l'entità deve esistere anche quando l'utente effettua l'accesso al database o all'istanza di SQL Server tramite l'appartenenza a un gruppo di Windows. Si suppongano ad esempio le condizioni seguenti:
Il gruppo CompanyDomain\SQLUsers ha accesso al database Sales.
CompanyDomain\SqlUser1 è membro del gruppo SQLUsers e pertanto può accedere implicitamente al database Sales.
Sebbene CompanyDomain\SqlUser1 sia in grado di accedere al database in virtù dell'appartenenza al gruppo SQLUsers, l'istruzione EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' avrà esito negativo perché CompanyDomain\SqlUser1 non esiste come entità nel database.
Procedura consigliata
Specificare un account di accesso o un utente che disponga almeno dei privilegi necessari per eseguire le operazioni definite nell'istruzione o nel modulo. Ad esempio, non specificare un nome account di accesso con autorizzazioni a livello di server se sono richieste solo autorizzazioni a livello di database oppure non specificare l'account di un proprietario di database a meno che siano richieste le autorizzazioni corrispondenti.
Autorizzazioni
Per eseguire l'istruzione EXECUTE, non è necessario disporre di autorizzazioni specifiche. Sono tuttavia richieste autorizzazioni per le entità a protezione diretta a cui viene fatto riferimento all'interno della stringa EXECUTE. Se, ad esempio, la stringa include un'istruzione INSERT, il chiamante dell'istruzione EXECUTE deve disporre dell'autorizzazione INSERT per la tabella di destinazione. Le autorizzazioni vengono verificate non appena viene rilevata l'istruzione EXECUTE, anche se l'istruzione è inclusa in un modulo.
Le autorizzazioni per l'istruzione EXECUTE per un modulo vengono assegnate per impostazione predefinita al proprietario del modulo, che può quindi trasferirle ad altri utenti. Quando si esegue un modulo che esegue una stringa, la verifica delle autorizzazioni viene eseguita nel contesto dell'utente che esegue il modulo e non nel contesto dell'utente che l'ha creato. Se, tuttavia, lo stesso utente è proprietario del modulo chiamante e del modulo richiamato, la verifica delle autorizzazioni per l'istruzione EXECUTE non viene eseguita per il secondo modulo. Per ulteriori informazioni, vedere Catene di proprietà.
Se il modulo accede ad altri oggetti di database, l'esecuzione ha esito positivo se per il modulo si dispone dell'autorizzazione EXECUTE e si verifica una delle condizioni seguenti:
Il modulo è contrassegnato come EXECUTE AS USER o SELF e il proprietario del modulo dispone delle autorizzazioni corrispondenti per l'oggetto a cui viene fatto riferimento. Per ulteriori informazioni sulla rappresentazione in un modulo, vedere Clausola EXECUTE AS (Transact-SQL).
Il modulo è contrassegnato come EXECUTE AS CALLER e si dispone delle autorizzazioni corrispondenti per l'oggetto.
Il modulo è contrassegnato come EXECUTE AS user_name e user_name dispone delle autorizzazioni corrispondenti per l'oggetto.
Autorizzazioni per il cambio di contesto
Per specificare l'istruzione EXECUTE AS per un account di accesso, il chiamante deve disporre delle autorizzazioni IMPERSONATE per il nome account di accesso specificato. Per specificare l'istruzione EXECUTE AS per un utente del database, il chiamante deve disporre delle autorizzazioni IMPERSONATE per il nome utente specificato. Se non si specifica alcun contesto di esecuzione oppure se si specifica EXECUTE AS CALLER, le autorizzazioni IMPERSONATE non sono obbligatorie.
Esempi
A. Utilizzo dell'istruzione EXECUTE per passare un parametro singolo
Nella stored procedure uspGetEmployeeManagers è previsto un parametro (@BusinessEntityID). Negli esempi seguenti viene eseguita la stored procedure uspGetEmployeeManagers, con BusinessEntityID 6 come valore di parametro.
USE AdventureWorks2008R2;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO
La variabile può essere specificata in modo esplicito durante l'esecuzione:
EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 6;
GO
Se si tratta della prima istruzione in un batch oppure di uno script osql or sqlcmd, non è necessario specificare EXEC.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @BusinessEntityID = 6;
GO
B. Utilizzo di più parametri
Nell'esempio seguente viene eseguita la stored procedure spGetWhereUsedProductID. Vengono passati due parametri, ovvero il primo parametro è un ID di prodotto (819), mentre il secondo parametro (@CheckDate,) è un valore di tipo datetime.
USE AdventureWorks2008R2;
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Utilizzo dell'istruzione EXECUTE 'tsql_string' con una variabile
Nell'esempio seguente viene illustrato come l'istruzione EXECUTE gestisca stringhe compilate in modo dinamico contenenti variabili. Nell'esempio viene creato il cursore tables_cursor che include un elenco di tutte le tabelle definite dall'utente nel database AdventureWorks2008R2, quindi l'elenco viene utilizzato per ricompilare tutti gli indici nella tabella.
USE AdventureWorks2008R2;
GO
DECLARE tables_cursor CURSOR
FOR
SELECT s.name, t.name
FROM sys.objects AS t
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname sysname;
DECLARE @tablename sysname;
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN;
EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
END;
PRINT 'The indexes on all tables have been rebuilt.';
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
GO
D. Utilizzo dell'istruzione EXECUTE con una stored procedure remota
Nell'esempio seguente viene eseguita la stored procedure uspGetEmployeeManagers nel server remoto SQLSERVER1 e lo stato restituito, che indica se la procedura è stata eseguita correttamente o meno, viene archiviato in @retstat.
DECLARE @retstat int;
EXECUTE @retstat = SQLSERVER1.AdventureWorks2008R2.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;
E. Utilizzo dell'istruzione EXECUTE con una variabile di stored procedure
Nell'esempio seguente viene creata una variabile che rappresenta il nome di una stored procedure.
DECLARE @proc_name varchar(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;
F. Utilizzo dell'istruzione EXECUTE con la parola chiave DEFAULT
Nell'esempio seguente viene creata una stored procedure con valori predefiniti per il primo e il terzo parametro. Quando si esegue la procedura, se nella chiamata non viene passato alcun valore oppure viene specificato il valore predefinito, i valori predefiniti vengono utilizzati per il primo e il terzo parametro. Si notino i vari utilizzi della parola chiave DEFAULT.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL
DROP PROCEDURE dbo.ProcTestDefaults;
GO
-- Create the stored procedure.
CREATE PROCEDURE dbo.ProcTestDefaults (
@p1 smallint = 42,
@p2 char(1),
@p3 varchar(8) = 'CAR')
AS
SET NOCOUNT ON;
SELECT @p1, @p2, @p3
;
GO
La stored procedure Proc_Test_Defaults può essere eseguita in molte combinazioni diverse.
-- Specifying a value only for one parameter (@p2).
EXECUTE dbo.ProcTestDefaults @p2 = 'A';
-- Specifying a value for the first two parameters.
EXECUTE dbo.ProcTestDefaults 68, 'B';
-- Specifying a value for all three parameters.
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';
-- Using the DEFAULT keyword for the first parameter.
EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D';
-- Specifying the parameters in an order different from the order defined in the procedure.
EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E';
-- Using the DEFAULT keyword for the first and third parameters.
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;
G. Utilizzo dell'istruzione EXECUTE con il parametro AT linked_server_name
Nell'esempio seguente una stringa di comando viene passata a un server remoto. Tale stringa crea il server collegato SeattleSales che punta a un'altra istanza di SQL Server ed esegue un'istruzione DDL (CREATE TABLE) in tale server collegato.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks2008R2.dbo.SalesTbl
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;
GO
H. Utilizzo dell'istruzione EXECUTE WITH RECOMPILE
Nell'esempio seguente viene eseguita la stored procedure Proc_Test_Defaults e quindi vengono impostati la compilazione, l'utilizzo e l'eliminazione di un nuovo piano di query dopo l'esecuzione del modulo.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
I. Utilizzo dell'istruzione EXECUTE con una funzione definita dall'utente
Nell'esempio seguente viene eseguita la funzione scalare definita dall'utente ufnGetSalesOrderStatusText. Viene utilizzata la variabile @returnstatus per archiviare il valore restituito dalla funzione. Per la funzione è previsto un parametro di input (@Status) definito come tipo di dati tinyint.
USE AdventureWorks2008R2;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO
J. Utilizzo dell'istruzione EXECUTE per eseguire query su un database Oracle in un server collegato
Nell'esempio seguente vengono eseguite più istruzioni SELECT nel server Oracle remoto. Viene innanzitutto aggiunto il server Oracle come server collegato e quindi viene creato l'account di accesso per il server collegato.
-- Setup the linked server.
EXEC sp_addlinkedserver
@server='ORACLE',
@srvproduct='Oracle',
@provider='OraOLEDB.Oracle',
@datasrc='ORACLE10';
EXEC sp_addlinkedsrvlogin
@rmtsrvname='ORACLE',
@useself='false',
@locallogin=null,
@rmtuser='scott',
@rmtpassword='tiger';
EXEC sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;
GO
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v INT;
SET @v = 7902;
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO
K. Utilizzo dell'istruzione EXECUTE AS USER per cambiare contesto a un altro utente
Nell'esempio seguente viene eseguita una stringa Transact-SQL che crea una tabella e viene quindi specificata la clausola AS USER per cambiare il contesto di esecuzione dell'istruzione dal chiamante a User1. Motore di database verificherà le autorizzazioni di User1 quando viene eseguita l'istruzione. User1 deve esistere come utente nel database e deve disporre delle autorizzazioni necessarie per creare tabelle nello schema Sales. In caso contrario, l'istruzione ha esito negativo.
USE AdventureWorks2008R2;
GO
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')
AS USER = 'User1';
GO
L. Utilizzo di un parametro con EXECUTE e AT linked_server_name
Nell'esempio seguente una stringa di comando viene passata a un server remoto utilizzando un punto interrogativo (?) come segnaposto per un parametro. Viene quindi creato un server collegato SeattleSales che punta a un'altra istanza di SQL Server e viene eseguita un'istruzione SELECT applicata a tale server collegato. L'istruzione SELECT utilizza il punto interrogativo come segnaposto per il parametro ProductID (952), specificato dopo l'istruzione.
-- Setup the linked server.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks2008R2.Production.Product
WHERE ProductID = ? ', 952) AT SeattleSales;
GO
Vedere anche