Partager via


Type de collecteur Requête T-SQL générique

Le type de collecteur Requête T-SQL générique exécute une instruction Transact-SQL fournie par l'utilisateur en tant que paramètre d'entrée, enregistre le résultat de la requête, puis le télécharge dans l'entrepôt de données de gestion. Ce type de collecteur est enregistré dans la vue core.supported_collector_types de l'entrepôt de données de gestion.

Ce collecteur possède les paramètres d'entrée suivants :

  • Value - La requête Transact-SQL. Vous pouvez fournir plusieurs requêtes en entrée.

  • OutputTable – fournissez le nom de la table pour enregistrer les résultats de requête avant qu'ils ne soient téléchargés dans l'entrepôt de données de gestion.

  • Database - Spécifiez la ou les bases de données sur lesquelles la requête doit s'exécuter. Vous pouvez spécifier des bases de données par nom ou utiliser le caractère générique * pour spécifier toutes les bases de données du serveur. Si vous n'attribuez pas de valeur au paramètre Database, la requête s'exécute sur toutes les bases de données système.

Schéma d'entrée Requête T-SQL générique

Voici le schéma d'entrée du collecteur Requête T-SQL générique.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="DataCollectorType">
  <xs:element name="TSQLQueryCollector">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Query" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Value" type="xs:string" />
              <xs:element name="OutputTable" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Databases" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Database" minOccurs="0" maxOccurs="unbounded" type="xs:string" />
            </xs:sequence>
            <xs:attribute name="UseSystemDatabases" type="xs:boolean" use="optional" />
            <xs:attribute name="UseUserDatabases" type="xs:boolean" use="optional" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Les exemples de code suivants montrent comment utiliser le schéma. Pour obtenir l'intégralité de l'exemple de code, consultez Procédure : créer un jeu d'éléments de collecte personnalisé qui utilise le type de collecteur Requête T-SQL générique.

Exemple 1

L'exemple suivant interroge les bases de données système et utilisateur, puis place les résultats dans la table custom_snapshots.VerifyDbName.

<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">
  <Query>
    <Value>SELECT DB_NAME() as db_name</Value>
    <OutputTable>VerifyDbName</OutputTable>
  </Query>
  <Databases UseSystemDatabases="true" UseUserDatabases="true" /> 
</ns:TSQLQueryCollector>

Exemple 2

L'exemple suivant interroge les trois bases de données système et place les résultats dans la table custom_snapshots.MyOutputTable1.

<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">
  <Query>
    <Value>SELECT * FROM sys.objects</Value>
    <OutputTable>MyOutputTable1</OutputTable>
  </Query>
  <Databases>
    <Database>model</Database>
    <Database>tempdb</Database>
    <Database>master</Database>
  </Databases>
</ns:TSQLQueryCollector>

Exemple 3

L'exemple suivant interroge uniquement les bases de données utilisateur et place les résultats dans les tables custom_snapshots.MyOutputTable2 et custom_snapshots.MyOutputTable3.

<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">
  <Query>
    <Value>SELECT * FROM sys.dm_tran_database_transactions</Value>
    <OutputTable>MyOutputTable2</OutputTable>
  </Query>
  <Query>
    <Value>SELECT * FROM sys.dm_db_file_space_usage</Value>
    <OutputTable>MyOutputTable3</OutputTable>
  </Query>
  <Databases UseSystemDatabases="false" UseUserDatabases="true" />
</ns:TSQLQueryCollector>

Quand utiliser des éléments de collecte distincts ?

Dans l'exemple précédent, toutes les requêtes sont exécutées sur le même jeu de bases de données. Si vous devez exécuter différentes requêtes pour différentes bases de données, vous devez créer un élément de collecte distinct pour chaque combinaison requête-base de données.

Deux bases de données qui ont un nom de table identique, mais un schéma différent constituent un autre scénario dans lequel des éléments de collecte différents sont requis. L'exemple 4 présente les éléments de collecte permettant de gérer ce scénario.

Exemple 4

Créez l'élément de collecte pour la première base de données, db1.

<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">
  <Query>
    <Value>SELECT * FROM mytable</Value> -- Query mytable
    <OutputTable>MyOutputTable1</OutputTable>
  </Query>
  <Databases>
    <Database>db1</Database>
  </Databases>
</ns:TSQLQueryCollector>

Créez l'élément de collection pour la seconde base de données, db2.

<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">
  <Query>
    <Value>SELECT * FROM mytable</Value> -- Query mytable
    <OutputTable>MyOutputTable2</OutputTable>
  </Query>
  <Databases>
    <Database>db2</Database>
  </Databases>
</ns:TSQLQueryCollector>

Traitement et résultat

Les métadonnées du résultat de la requête dépendent de l'instruction Transact-SQL spécifiée par l'utilisateur, mais les mappages de colonnes dans la source ou la destination du flux de données sont créés au moment de la conception. Autrement dit, chaque élément de collection qui utilise ce type de collecteur requiert un package personnalisé généré au moment de l'exécution et adapté au format de son schéma.

Le collecteur de données utilise une tâche personnalisée pour créer un package de collection et un package de téléchargement lorsqu'un nouvel élément de collection est reçu, ou si les paramètres d'entrée d'un élément de collection sont mis à jour. Ces packages sont enregistrés dans la base de données msdb afin d'être réutilisés.

La collecte et le téléchargement de données ont un comportement similaire à celui qui est décrit dans Architecture et traitement du collecteur de données, mais sont implémentés de manière légèrement différente pour le type de collecteur Requête T-SQL générique.

Les tables d'entrepôt de données de gestion suivantes permettent de stocker les données recueillies par le type de collecteur Requête T-SQL générique :

  • core.snapshots - Cette table identifie chaque nouvel instantané.

  • core.snapshot_timetable - L'heure de l'instantané est stockée dans une table distincte, car de nombreux instantanés peuvent s'exécuter pratiquement en même temps.

  • core.source.info - Cette table stocke des informations sur la source de données ainsi que les données.

Limitations

L'utilisation du type de collecteur Requête T-SQL générique est soumise aux limitations suivantes :

  • Les noms de colonnes suivants sont réservés pour le collecteur de données : snapshot_time, snapshot_id et database_name. Aucune table créée par des jeux d'éléments de collection personnalisés ne peut utiliser ces noms. Une erreur est retournée si vous tentez de les utiliser.

  • Une colonne de type sysname est convertie en colonne nvarchar(128) lorsqu'elle est copiée dans l'entrepôt de données de gestion. Pendant la collecte de données, SQL Server 2008 Integration Services (SSIS) convertit les types de données de base de données en types de données SSIS (par exemple, sysname devient DT_WSTR et nvarchar(len) devient DT_WSTR). Cette conversion se produit dans la tâche de flux de données de source OLE DB. Pendant le téléchargement de données, le collecteur de données lit les données du cache comme un type de données SSIS et les données sont traitées en tant que données nvarchar(128) qui est équivalent, au niveau fonctionnel, à sysname.

  • Une colonne de type char(N) devient varchar(N) lorsqu'elle est copiée dans l'entrepôt de données de gestion (les données char(N) peuvent être contenues dans des données varchar(N)). Excepté le fait que la taille de stockage des données char est fixe alors que la taille de stockage des données varchar est variable, ces types sont traités de manière équivalente au niveau fonctionnel.

  • Une colonne de type varbinary devient binary lorsqu'elle est copiée dans l'entrepôt de données de gestion.

  • Une colonne de type decimal devient numeric lorsqu'elle est copiée dans l'entrepôt de données de gestion.

  • Une colonne de type nchar devient nvarchar lorsqu'elle est copiée dans l'entrepôt de données de gestion.

  • Le type sqlvariant est géré par le traitement par défaut pour les colonnes que SSIS ne gère pas directement. Autrement dit, les colonnes sont traitées comme des colonnes nvarchar(255), en laissant le fournisseur de données se charger des conversions.

    Notes

    Dans ce cas, la colonne est créée avec une longueur par défaut de 255 caractères. Il est toutefois possible de la faire passer à 4000 caractères.

  • Toutes les colonnes retournées par une requête Transact-SQL doivent avoir un nom. Par exemple, select 1 ne fonctionne pas alors que select 1 as one fonctionne.

  • Les types de données suivants ne sont pas pris en charge par SSIS et ne peuvent pas être inclus sous forme de colonnes dans une table de sortie générée par un jeu d'éléments de collecte qui utilise le type de collecteur Requête T-SQL générique :

    • image

    • text

    • ntext

    • XML

  • Toutes les requêtes exécutées par le type de collecteur Requête T-SQL générique doivent retourner un jeu de résultats unique.

  • Les requêtes de table temporaire locale sont prises en charge uniquement si elles sont déclarées au préalable dans le cadre du même lot. Les requêtes de table temporaire globale sont intégralement prises en charge.

  • Aucun index, clé privée, clé étrangère ou aucune autre contrainte n'est transmis aux tables cibles dans l'entrepôt de données de gestion. Cela est dû au fait que les mêmes données sont interrogées plusieurs fois et que les données peuvent être transférées à partir de plusieurs ordinateurs dans une seule table.

  • Toute autre limitation portant sur le type des requêtes prises en charge, qui s'applique à la tâche de flux de données de source OLE DB dans SSIS, s'applique également au type de collecteur Requête T-SQL générique.