FSharp.Data.SqlClient repose sur sys.sp_describe_first_result_set
pour découvrir le schéma du jeu de résultats d'une requête. Le problème est que cela nécessite une connection à la database SQL Server au moment de la design / construction. Est-il possible d'get cette information à partir d'un .dacpac
? Les applications de niveau Data prétendent "activer le développement de database déclarative".
Il y a des bibliothèques pour lire le dacpac et son contenu et le T-SQL AST. Je pense que les types d'input 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
La dérivation d'une list des inputs et sorties du model déclaratif est-elle possible / fiable? Y a-t-il un bon endroit pour save une request de fonctionnalité? 🙂
Pour les requêtes simples (select * à partir de la table etc), il est simple, utilisez le scriptdom pour get les noms et les tables des colonnes – J'ai un exemple dans un ancien billet pour get les types de colonnes et énumérer les tables:
Cela vous montre un exemple d'utilisation du scriptdom, il est assez simple une fois que vous comprenez que vous devez utiliser le model de visiteur pour get les bits dont vous avez besoin:
Le problème est que les gens peuvent écrire étrange t-sql que le server SQL fonctionne avec bonheur et de travailler sur l'intention réelle du code est difficile, même avec l'API est disponible.
Donc, travailler sur ce qu'il faut faire dans tous les cas est difficile (pas 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 – obtenez-vous 2 valeurs int ou une string et toutes les valeurs sur la table? Je suppose que c'est déjà un problème avec le client SQL existant.
Autre chose qui complique les conversions implicites qui se produisent dans sql:
select 100, getdate() + '2014-01-01'
L'ast dira que vous avez une fonction et une string – vous devrez get le type de return de getdate et ensuite savoir que l'ajout d'une string à une date vous donne une date – facile quand vous avez un résultat, un peu plus difficile quand vous avoir 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!