Afficher DataType et la taille de la colonne à partir des résultats de requête SQL Server à l'exécution

Existe-t-il un moyen d'exécuter une requête et d'avoir SQL Server Management Studio ou sqlcmd ou quelque chose simplement afficher le type de données et la taille de chaque colonne comme il a été reçu.

Il semble que cette information doit être présente pour la transmission des données entre le server et le client. Ce serait très utile pour moi si cela pouvait être affiché.

Un peu de context: La raison pour laquelle je request est parce que je dois m'interfacer avec d'innombrables procédures stockées héritées avec n'importe où de 50 à 5000+ lignes de code chacune. Je ne veux pas avoir à essayer de suivre le stream de la logique cryptique dans et hors des tables temporaires, dans d'autres procédures, dans l'instruction eval concaténée de string et ainsi de suite. Je souhaite ne garder aucune connaissance de la mise en œuvre, simplement à quoi s'attendre quand ils travaillent. Malheureusement suivre le stream logique semble être le seul moyen de comprendre ce qui est exactement returnné sans essayer de déduire quels sont les types réels de la string de données représentations om studio de gestion de studio ou du type natif dans .net par exemple.

Pour clarifier: Je ne request pas comment dire les types d'une table ou quelque chose de statique comme ça. Je suis sûr que quelque chose comme sp_help ne m'aidera pas. Je request comment dire quels sont les types de servers sql (ie varchar (25), int …) de ce qu'on m'a donné. De plus, il n'est pas possible de changer la mise en œuvre des sprocs, alors considérez cela dans vos solutions. J'espère vraiment qu'il y a une command que j'ai ratée quelque part. Beaucoup d'appréciation à tous.

Mise à jour Je suppose que ce que je request vraiment, c'est comment get le schéma du jeu de résultats lorsque l'set de résultats provient d'une requête utilisant une table temporaire. Je comprends que c'est impossible, mais je n'ai pas beaucoup de sens avec cette conclusion parce que datatables sont transmises après tout. Voici un exemple d'une procédure stockée qui provoquerait un problème.

CREATE PROCEDURE [dbo].[IReturnATempTable] AS Create table #TempTable ( MyMysteryColumn char(50) ) INSERT #TempTable ( MyMysteryColumn ) VALUES ( 'Do you know me?' ) select TOP 50 * FROM #TempTable 

Que ferez-vous des procédures stockées qui renvoient des sets de résultats différents en fonction de leurs parameters?

Dans tous les cas, vous pouvez configurer une SqlDataAdapter.SelectCommand, avec les parameters nécessaires, puis appeler la méthode FillSchema. En supposant que le schéma peut être déterminé, vous obtiendrez un DataTable configuré avec des noms et des types de colonnes corrects, et certaines contraintes.

Un peu long, essayez de jouer avec SET FMTONLY ON (ou off). Selon BOL, cela "renvoie uniquement les métadonnées au client.Peut être utilisé pour tester le format de la réponse sans réellement exécuter la requête." Je pense que cela inclura ce que vous cherchez, car BCP l'utilise. (J'ai trébuché sur ce paramètre lors du debugging de certains problèmes BCP très bizarre.)

Pourriez-vous append un autre select à votre procédure?

Si c'est le cas, vous pourrez peut-être le faire en utilisant la fonction sql_variant_property .

 Declare @Param Int Set @Param = 30 Select sql_variant_property(@Param, 'BaseType') Select sql_variant_property(@Param, 'Precision') Select sql_variant_property(@Param, 'Scale') 

J'ai posté cela sur cette question.

Je request comment dire quels sont les types de server sql (ie varchar (25), int …) de ce que l'on m'a donné

Vous pouvez alors imprimer le type, la précision (ie 25 si son VarChar (25)), et l'échelle du paramètre.

J'espère que ça aide … 🙂

Si vous n'êtes pas limité à T-SQL, et que cela ne vous dérange pas d'exécuter les SP (parce que SET FMTONLY ON n'est pas entièrement fiable), vous pouvez certainement appeler les SP à partir d'un SqlDataReader . Puis inspectez le SqlDataReader pour get les colonnes et les types de données. Vous pouvez également avoir plusieurs sets de résultats, vous pouvez également accéder facilement au jeu de résultats suivant à partir de cet environnement.

Ce code devrait vous corriger. Il renvoie un jeu de données de schéma uniquement sans loggings. Vous pouvez utiliser ce dataset pour interroger le DataType des colonnes et toutes les autres métadonnées. Plus tard, si vous le souhaitez, vous pouvez remplir le DataSet avec des loggings en créant un SqlDataAdapter et en appelant sa méthode Fill (IDataAdapter.Fill).

 private static DataSet FillSchema(SqlConnection conn) { DataSet ds = new DataSet(); using (SqlCommand formatCommand = new SqlCommand("SET FMTONLY ON;", conn)) { formatCommand.ExecuteNonQuery(); SqlDataAdapter formatAdapter = new SqlDataAdapter(formatCommand); formatAdapter.FillSchema(ds, SchemaType.Source); formatCommand.CommandText = "SET FMTONLY OFF;"; formatCommand.ExecuteNonQuery(); formatAdapter.Dispose(); } return ds; }