2

FSharp.Data.SqlClient repose sur sys.sp_describe_first_result_set pour découvrir le schéma de l'ensemble de résultats d'une requête. Le problème est que cela nécessite une connexion à la base de données SQL Server au moment de la conception/construction. Est-il possible d'obtenir cette information d'un .dacpac? Data-tier Applications affirme "activer le développement de base de données déclarative".Obtenez les entrées et sorties T-SQL en utilisant un dacpac?

FSharp.Data.SqlClient

Il existe des bibliothèques pour lire les dacpac et son contenu et l'AST T-SQL. Je pense que les types d'entrée et de sortie pourraient être dérivés de cette information.

// C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\Microsoft.SqlServer.Dac.dll 
// C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\Microsoft.SqlServer.Dac.Extensions.dll 
// C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.TransactSql.ScriptDom.dll 

open Microsoft.SqlServer.Dac 
open Microsoft.SqlServer.Dac.Model 
open Microsoft.SqlServer.TransactSql.ScriptDom 

Est-ce qu'une dérivation d'une liste des entrées et sorties du modèle déclaratif est possible/fiable? Y a-t-il un bon endroit pour enregistrer une demande de fonctionnalité? :-)

Répondre

4

Pour les requêtes simples (sélectionnez * depuis table etc) c'est simple, utilisez le scriptdom pour obtenir les noms et tables des colonnes - J'ai un exemple dans un ancien blog pour obtenir les types de colonnes et énumérer les tables:

https://sqlserverfunctions.wordpress.com/2014/09/27/querying-the-dacfx-api-getting-column-type-information/

Cela vous montre un exemple d'utilisation du scriptdom, il est assez simple une fois que vous comprendre, vous devez utiliser le modèle de visiteur pour obtenir aux bits dont vous avez besoin:

http://blogs.msdn.com/b/arvindsh/archive/2013/04/04/using-the-transactsql-scriptdom-parser-to-get-statement-counts.aspx

Le problème est que les gens peuvent écrire étrange t-sql que le serveur sql fonctionne avec et travailler sur l'intention réelle du code est difficile, même avec l'API disponible.

donc travailler sur ce qu'il faut faire dans tous les cas est difficile (impossible mais difficile), par exemple:

create procedure getdata 
as 

if exists(select * from schema.table where id = 999) 
begin 
    select 100 as id, 101 as number; 
    return 
end 

select 'abc' as name, * from schema.another_table 

Qu'est-ce que vous obtenez - vous obtenez 2 valeurs int ou une chaîne et toutes les valeurs sur la table? Je suppose que c'est déjà un problème avec le client SQL existant.

Quelque chose d'autre qui le rend plus difficile est des conversions implicites qui se passent dans sql:

select 100, getdate() + '2014-01-01' 

Le ast vous diront que vous avez une fonction et une chaîne - dont vous aurez besoin pour obtenir le type de retour de getdate puis savoir que l'ajout d'une chaîne à une date vous donne une date - facile quand vous avez un résultat, un peu plus difficile quand vous avez juste le code.

Si c'est quelque chose que vous voulez faire alors s'il vous plaît ne soyez pas rebutés, gardez simplement à l'esprit qu'il y a quelques défis!