sp_describe_first_result_set (Transact-SQL)

Retourne les métadonnées pour le premier jeu de résultats possible du lot Transact-SQL. Retourne un jeu de résultats vide si le lot ne retourne pas de résultats. Génère une erreur si le moteur de base de données ne peut pas déterminer les métadonnées pour la première requête qui sera exécutée en effectuant une analyse statique. Le vue de gestion dynamique sys.dm_exec_describe_first_result_set (Transact-SQL) retourne les mêmes informations.

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

sp_describe_first_result_set [ @tsql = ] N'Transact-SQL_batch' 
    [ , [ @params = ] N'parameters' ] 
    [ , [ @browse_information_mode = ] <tinyint> ] ]

Arguments

  • [ @tsql = ] 'Transact-SQL_batch'
    Une ou plusieurs instructions Transact-SQL Transact-SQL_batch  peut être nvarchar(n) ou nvarchar(max).

  • [ @params = ] N'parameters'
    @params fournit une chaîne de déclaration pour les paramètres du lot Transact-SQL, ce qui est semblable à sp_executesql. Les paramètres peuvent être nvarchar(n) ou nvarchar(max).

    Chaîne contenant les définitions de tous les paramètres qui ont été incorporés dans le _batch Transact-SQL. Cette chaîne doit être une constante Unicode ou une variable Unicode. Chaque définition de paramètre se compose d'un nom de paramètre et d'un type de données. n correspond à un espace réservé pour d'autres définitions de paramètres. Chaque paramètre spécifié dans l'instruction doit être défini dans @params. Si le lot ou l'instruction Transact-SQL dans l'instruction ne contient aucun paramètre, il est inutile d'utiliser @params. La valeur par défaut de ce paramètre est NULL.

  • [ @browse_information_mode = ] tinyint
    Spécifie si des colonnes clés supplémentaires et les informations de table source sont retournées. Si la valeur 1 est définie, chaque requête est analysée comme si elle incluait une option FOR BROWSE sur la requête. Des colonnes clés supplémentaires et les informations de table source sont retournées.

    • Si la valeur est 0, aucune information n'est retournée.

    • Si la valeur 1 est définie, chaque requête est analysée comme si elle incluait une option FOR BROWSE sur la requête. Retourne les noms de tables de base comme informations de colonne source.

    • Si la valeur 2 est définie, chaque requête est analysée comme si elle était utilisée lors de la préparation ou de l'exécution d'un curseur. Retourne les noms de vues comme informations de colonne source.

Valeurs des codes de retour

sp_describe_first_result_set retourne toujours un état de zéro en cas de réussite. Si la procédure génère une erreur et qu'elle est appelée comme RPC, l'état de retour est renseigné en fonction du type d'erreur décrit dans la colonne error_type de sys.dm_exec_describe_first_result_set. Si la procédure est appelée de Transact-SQL, la valeur de retour est toujours de zéro, même en présence d'une erreur.

Jeux de résultats

Ces métadonnées communes sont retournées en tant que jeu de résultats avec une ligne pour chaque colonne dans les métadonnées de résultats. Chaque ligne décrit le type et la possibilité de valeur NULL de la colonne dans le format décrit dans la section suivante. S'il n'existe pas de première instruction pour chaque chemin d'accès de contrôle, un jeu de résultats avec des lignes nulles est retourné.

Nom de la colonne

Type de données

Description

is_hidden

bit NOT NULL

Indique que la colonne est une colonne supplémentaire ajoutée à titre d'informations de navigation et qu'elle ne s'affiche pas réellement dans le jeu de résultats.

column_ordinal

int NOT NULL

Contient la position ordinale de la colonne dans le jeu de résultats. La position de la première colonne sera spécifiée comme 1.

name

sysname NULL

Contient le nom de la colonne si un nom peut être déterminé. Sinon, il contiendra NULL.

is_nullable

bit NOT NULL

Contient la valeur 1 si la colonne autorise des valeurs NULL, 0 si la colonne n'autorise pas de valeurs NULL, et 1 s'il n'est pas possible de déterminer si la colonne autorise des valeurs NULL.

system_type_id

int NOT NULL

Contient le system_type_id du type de données de la colonne comme spécifié dans sys.types. Pour les types CLR, bien que la colonne system_type_name retourne NULL, cette colonne retournera la valeur 240.

system_type_name

nvarchar(256) NULL

Contient le nom et les arguments (tels que la longueur, la précision, l'échelle) spécifiés pour le type de données de la colonne. Si le type de données est un type d'alias défini par l'utilisateur, le type de système sous-jacent est spécifié ici. S'il s'agit d'un type clr défini par l'utilisateur, NULL est retourné dans cette colonne.

max_length

smallint NOT NULL

Longueur maximale (en octets) de la colonne.

-1 = le type de données de la colonne est varchar(max), nvarchar(max), varbinary(max) ou xml.

Pour les colonnes de type text, la valeur max_length sera 16 ou la valeur définie par sp_tableoption 'text in row'.

precision

tinyint NOT NULL

Précision de la colonne si elle est numérique. Dans le cas contraire, retourne la valeur 0.

scale

tinyint NOT NULL

Échelle de la colonne si elle est numérique. Dans le cas contraire, retourne la valeur 0.

collation_name

sysname NULL

Nom du classement de la colonne si elle est basée sur les caractères. Dans le cas contraire, la valeur NULL est retournée.

user_type_id

int NULL

Pour les types d'alias et CLR, contient l'information user_type_id du type de données de la colonne comme spécifié dans sys.types. Sinon, la valeur est NULL.

user_type_database

sysname NULL

Pour les types d'alias et CLR, contient le nom de la base de données dans laquelle le type est défini. Sinon, la valeur est NULL.

user_type_schema

sysname NULL

Pour les types d'alias et CLR, contient le nom du schéma dans lequel le type est défini. Sinon, la valeur est NULL.

user_type_name

sysname NULL

Pour les types d'alias et CLR, contient le nom du type. Sinon, la valeur est NULL.

assembly_qualified_type_name

nvarchar(4000)

Pour les types CLR, retourne le nom de l'assembly et de la classe définissant le type. Sinon, la valeur est NULL.

xml_collection_id

int NULL

Contient l'information xml_collection_id du type de données de la colonne comme spécifié dans sys.columns. Cette colonne retournera NULL si le type retourné n'est pas associé à une collection de schémas XML.

xml_collection_database

sysname NULL

Contient la base de données dans laquelle la collection de schémas XML associée à ce type est définie. Cette colonne retournera NULL si le type retourné n'est pas associé à une collection de schémas XML.

xml_collection_schema

sysname NULL

Contient le schéma dans lequel la collection de schémas XML associée à ce type est définie. Cette colonne retournera NULL si le type retourné n'est pas associé à une collection de schémas XML.

xml_collection_name

sysname NULL

Contient le nom de la collection de schémas XML associé à ce type. Cette colonne retournera NULL si le type retourné n'est pas associé à une collection de schémas XML.

is_xml_document

bit NOT NULL

Retourne 1 si le type de données retourné est XML et que ce type est garanti être un document XML complet (nœud racine compris), par opposition à un fragment XML. Dans le cas contraire, retourne la valeur 0.

is_case_sensitive

bit NOT NULL

Retourne 1 si la colonne est un type chaîne sensible à la casse et 0 si ce n'est pas le cas.

is_fixed_length_clr_type

bit NOT NULL

Retourne 1 si la colonne est un type CLR de longueur fixe et 0 si ce n'est pas le cas.

source_server

sysname

Nom du serveur d'origine retourné par la colonne dans ce résultat (s'il provient d'un serveur distant). Le nom est donné tel qu'il s'affiche dans sys.servers. Retourne NULL si la colonne provient du serveur local, ou s'il est impossible de déterminer la provenance du serveur. Fourni uniquement si les informations de navigation sont demandées.

source_database

sysname

Nom de la base de données d'origine retourné par la colonne dans ce résultat. Retourne NULL si la base de données ne peut pas être déterminée. Fourni uniquement si les informations de navigation sont demandées.

source_schema

sysname

Nom du schéma d'origine retourné par la colonne dans ce résultat. Retourne NULL si le schéma ne peut pas être déterminé. Fourni uniquement si les informations de navigation sont demandées.

source_table

sysname

Nom de la table d'origine retourné par la colonne dans ce résultat. Retourne NULL si la table ne peut pas être déterminée. Fourni uniquement si les informations de navigation sont demandées.

source_column

sysname

Nom de la colonne d'origine retourné par la colonne de résultat. Retourne NULL si la colonne ne peut pas être déterminée. Fourni uniquement si les informations de navigation sont demandées.

is_identity_column

bit NULL

Retourne 1 si la colonne est une colonne d'identité et 0 dans le cas contraire. Retourne NULL s'il est impossible de déterminer que la colonne est une colonne d'identité.

is_part_of_unique_key

bit NULL

Retourne 1 si la colonne fait partie d'un index unique (notamment la contrainte unique et primaire) et 0 dans le cas contraire. Retourne NULL s'il est impossible de déterminer que la colonne fait partie d'un index unique. Fourni uniquement si les informations de navigation sont demandées.

is_updateable

bit NULL

Retourne 1 si la colonne peut être mise à jour et 0 dans le cas contraire. Retourne NULL s'il est impossible de déterminer que la colonne peut être mise à jour.

is_computed_column

bit NULL

Retourne 1 si la colonne est une colonne calculée et 0 dans le cas contraire. Retourne NULL s'il est impossible de déterminer que la colonne est une colonne calculée.

is_sparse_column_set

bit NULL

Retourne 1 si la colonne est une colonne éparse et 0 dans le cas contraire. Retourne NULL s'il est impossible de déterminer que la colonne fait partie d'un jeu de colonnes éparses.

ordinal_in_order_by_list

smallint NULL

Position de cette colonne dans la liste ORDER BY. Retourne NULL si la colonne ne s'affiche pas dans la liste ORDER BY ou si la liste ORDER BY ne peut pas être déterminée de manière unique.

order_by_list_length

smallint NULL

Longueur de la liste ORDER BY. Retourne NULL s'il n'existe aucune liste ORDER BY ou si la liste ORDER BY ne peut pas être déterminée de manière unique. Notez que cette valeur sera la même pour toutes les lignes retournées par sp_describe_first_result_set.

order_by_is_descending

smallint NULL

Si la valeur ordinal_in_order_by_list n'est pas NULL, la colonne order_by_is_descending indique la direction de la clause ORDER BY pour cette colonne. Sinon, elle indique NULL.

tds_type_id

int NOT NULL

À usage interne uniquement.

tds_length

int NOT NULL

À usage interne uniquement.

tds_collation_id

int NULL

À usage interne uniquement.

tds_collation_sort_id

tinyint NULL

À usage interne uniquement.

Notes

sp_describe_first_result_set garantit que si la procédure retourne les premières métadonnées de jeu de résultats pour (un hypothétique) lot A et si ce lot (A) est exécuté par la suite, le lot (1) génère une erreur de durée d'optimisation, (2) génère une erreur d'exécution, (3) ne retourne aucun jeu de résultats ou (4) retourne un premier jeu de résultats avec les mêmes métadonnées décrites par sp_describe_first_result_set.

Le nom, la possibilité de valeur NULL et le type de données peuvent différer. Si sp_describe_first_result_set retourne un jeu de résultats vide, l'exécution du lot retournera forcément des jeux sans résultats.

Cette garantie suppose qu'aucune modification de schéma pertinente n'a lieu sur le serveur. Les modifications de schéma pertinentes sur le serveur n'incluent pas la création de tables temporaires ou de variables de table dans le lot A entre le moment où sp_describe_first_result_set est appelé et celui où le jeu de résultats est retourné pendant l'exécution, notamment les modifications de schéma effectuées par le lot B.

sp_describe_first_result_set retourne une erreur dans chacun des cas suivants.

  • Si l'entrée @tsql n'est pas un lot Transact-SQL valide. La validité est déterminée en analysant le lot Transact-SQL. Toutes les erreurs provoquées par le lot pendant l'optimisation de requête ou en cours d'exécution ne sont pas prises en compte au moment de déterminer si le lot Transact-SQL est valide.

  • Si @params n'est pas NULL et contient une chaîne qui n'est pas une chaîne de déclaration valide du point de vue syntaxique pour les paramètres, ou s'il contient une chaîne qui déclare un paramètre plusieurs fois.

  • Si le lot Transact-SQL d'entrée déclare une variable locale du même nom qu'un paramètre déclaré dans @params.

  • Si l'instruction utilise une table temporaire.

  • La requête inclut la création d'une table permanente qui est alors interrogée.

Si tous les autres contrôles réussissent, tous les chemins d'accès de flux de contrôle possibles à l'intérieur du lot d'entrée sont pris en compte. Cela prend en considération toutes les instructions de flux de contrôle (blocs GOTO, IF/ELSE, WHILE et Transact-SQLTRY/CATCH) ainsi que toutes les procédures, les lots Transact-SQL dynamiques ou les déclencheurs appelés depuis le lot d'entrée par une instruction EXEC, une instruction DDL qui entraîne l'exécution des déclencheurs DDL ou une instruction DML qui entraîne l'exécution des déclencheurs sur une table cible ou sur une table modifiée en raison d'une action en cascade sur une contrainte de clé étrangère. Dans le cas de nombreux chemins d'accès de contrôle possibles, un algorithme s'arrête à un point donné.

Pour chaque chemin d'accès de flux de contrôle, la première instruction (le cas échéant) qui retourne un jeu de résultats est déterminée par sp_describe_first_result_set.

Lorsque plusieurs premières instructions possibles sont trouvées dans un lot, leurs résultats peuvent différer selon le nombre de colonnes, le nom de colonne, la possibilité de valeur NULL et le type de données. La gestion de ces différences fait l'objet d'une description plus détaillée dans cette rubrique :

  • Si le nombre de colonnes diffère, une erreur est générée et aucun résultat n'est retourné.

  • Si le nom de colonne diffère, le nom de colonne retourné est défini sur NULL.

  • Si la possibilité de valeur NULL diffère, la possibilité de valeur NULL retournée autorisera des valeurs NULL.

  • Si le type de données diffère, une erreur est générée et aucun résultat n'est retourné à l'exception des cas suivants :

    • varchar(a) en varchar(a') où a' > a.

    • varchar(a) to varchar(max)

    • nvarchar(a) en nvarchar(a') où a' > a.

    • nvarchar(a) to nvarchar(max)

    • varbinary(a) en varbinary(a') où a' > a.

    • varbinary(a) to varbinary(max)

sp_describe_first_result_set ne prend pas en charge la récursivité indirecte.

Autorisations

Requiert l'autorisation d'exécuter l'argument @tsql.

Exemples

Exemples types

A.Exemple simple

L'exemple suivant décrit le jeu de résultats retourné par une requête unique.

sp_describe_first_result_set @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes'

L'exemple suivant affiche le jeu de résultats retourné par une requête unique qui contient un paramètre.

sp_describe_first_result_set @tsql = 
N'SELECT object_id, name, type_desc 
FROM sys.indexes 
WHERE object_id = @id1'
, @params = N'@id1 int'

B.Exemples de modes de navigation

Les trois exemples suivants illustrent la principale différence entre les différents modes de navigation. Seules les colonnes appropriées ont été incluses dans les résultats de la requête.

L'exemple qui utilise 0 indique qu'aucune information est retournée.

CREATE TABLE dbo.t (a int PRIMARY KEY, b1 int);
GO
CREATE VIEW dbo.v AS SELECT b1 AS b2 FROM dbo.t;
GO
EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM dbo.v', null, 0;

Voici l'ensemble des résultats.

is_hidden

column_ordinal

name

source_schema

source_table

source_column

is_part_of_unique_key

0

1

b3

NULL

NULL

NULL

NULL

L'exemple qui utilise 1 indique qu'il retourne les informations comme s'il incluait une option FOR BROWSE sur la requête.

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM v', null, 1

Voici l'ensemble des résultats.

is_hidden

column_ordinal

name

source_schema

source_table

source_column

is_part_of_unique_key

0

1

b3

dbo

t

B1

0

1

2

a

dbo

t

a

1

L'exemple qui utilise 2 indique une analyse comme si vous prépariez un curseur.

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM v', null, 2

Voici l'ensemble des résultats.

is_hidden

column_ordinal

name

source_schema

source_table

source_column

is_part_of_unique_key

0

1

B3

dbo

v

B2

0

1

2

ROWSTAT

NULL

NULL

NULL

0

Exemples de problèmes

Les exemples suivants utilisent deux tables pour tous les exemples. Exécutez les instructions suivantes pour créer les tables d'exemples.

CREATE TABLE dbo.t1 (a int NULL, b varchar(10) NULL, c nvarchar(10) NULL);
CREATE TABLE dbo.t2 (a smallint NOT NULL, d varchar(20) NOT NULL, e int NOT NULL);

Erreur car le nombre de colonnes diffère

Le nombre de colonnes dans les premiers jeux de résultats possibles diffère dans cet exemple.

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    SELECT a FROM t1;
ELSE
    SELECT a, b FROM t1;
SELECT * FROM t; -- Ignored, not a possible first result set.'

Erreur car les types de données diffèrent

Les types de colonnes diffèrent dans les premiers jeux de résultats possibles.

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    SELECT a FROM t1;
ELSE
    SELECT a FROM t2;

Résultat : Erreur, types discordants (int et smallint).

Le nom de colonne ne peut pas être déterminé

Les colonnes dans les premiers jeux de résultats possibles diffèrent de par la longueur pour le même type de longueur variable, la possibilité de valeur NULL et les noms de colonne :

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    SELECT b FROM t1;
ELSE
    SELECT d FROM t2; '

Résultat : <nom de colonne inconnu> varchar(20) NULL

Nom de colonne forcé à être identique par crénelage

Identique à l'exemple précédent, mais les colonnes ont le même nom via le crénelage de colonne.

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    SELECT b FROM t1;
ELSE
    SELECT d AS b FROM t2;'

Résultat : b varchar(20) NULL

Erreur car les types de colonne ne peuvent pas être mis en correspondance

Les types de colonnes diffèrent dans les premiers jeux de résultats possibles.

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    SELECT b FROM t1;
ELSE
    SELECT c FROM t1;'

Résultat : Erreur, types discordants (varchar(10) et nvarchar(10)).

Le jeu de résultats peut retourner une erreur

Le premier jeu de résultats est soit une erreur, soit un jeu de résultats.

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    RAISERROR(''Some Error'', 16, 1);

ELSE
    SELECT a FROM t1;
SELECT e FROM t2; -- Ignored, not a possible first result set.;'

Résultat : int NULL

Certains chemins de code ne retournent pas de résultats

Le premier jeu de résultats est soit Null, soit un jeu de résultats.

sp_describe_first_result_set @tsql = 
N'
IF(1=1)
    RETURN;
SELECT a FROM t1;'

Résultat : int NULL

Résultat du SQL dynamique

Le premier jeu de résultats est SQL dynamique qui est détectable car il s'agit d'une chaîne littérale.

sp_describe_first_result_set @tsql = 
N'EXEC(N''SELECT a FROM t1'');'

Résultat : INT NULL

Échec du résultat du SQL dynamique

Le premier jeu de résultats est indéfini en raison du SQL dynamique.

sp_describe_first_result_set @tsql = 
N'
DECLARE @SQL NVARCHAR(max);
SET @SQL = N''SELECT a FROM t1 WHERE 1 = 1 '';
IF(1=1)
    SET @SQL += N'' AND e > 10 '';
EXEC(@SQL); '

Résultat : Erreur. Le résultat n'est pas détectable en raison du SQL dynamique.

Jeu de résultats spécifié par l'utilisateur

Le premier jeu de résultats est spécifié manuellement par l'utilisateur.

sp_describe_first_result_set @tsql = 
N'
DECLARE @SQL NVARCHAR(max);
SET @SQL = N''SELECT a FROM t1 WHERE 1 = 1 '';
IF(1=1)
    SET @SQL += N'' AND e > 10 '';
EXEC(@SQL)
    WITH RESULT SETS(
        (Column1 BIGINT NOT NULL)
    ); '

Résultat : Column1 bigint NOT NULL

Erreur provoquée par un jeu de résultats ambigu

Cet exemple suppose qu'un autre utilisateur nommé user1 a une table nommée t1 dans le schéma par défaut s1 avec des colonnes (int NOT NULL).

sp_describe_first_result_set @tsql = 
N'
    IF(@p > 0)
    EXECUTE AS USER = ''user1'';
    SELECT * FROM t1;'
, @params = N'@p int'

Résultat : Erreur. t1 peut être dbo.t1 ou s1.t1, chacun avec un nombre différent de colonnes.

Résultat même avec un jeu de résultats ambigu

Utilisez les mêmes hypothèses que l'exemple précédent.

sp_describe_first_result_set @tsql = 
N'
    IF(@p > 0)
    EXECUTE AS USER = ''user1'';
    SELECT a FROM t1;'

Résultat : int NULL, car dbo.t1.a et s1.t1.a ont un type int et une possibilité de valeur NULL différents.

Voir aussi

Référence

sp_describe_undeclared_parameters (Transact-SQL)

sys.dm_exec_describe_first_result_set (Transact-SQL)

sys.dm_exec_describe_first_result_set_for_object (Transact-SQL)