Question

  • Est-il possible de faire un gros projet en C # (beaucoup de fonctions), alors,
  • Créez un assemblage CLR pour celui-ci, puis
  • Dans SQL Server IN A STORED PROC, appelez une fonction qui se trouve dans l'assembly,
  • La table (que je passerais à ASSEMBLY) est calculée dans un autre processus stocké ...

    • Dans l'affirmative, quelles seraient les étapes?

Je pense à quelque chose comme ça.

-- I have a stored proc that gets a table, let it be myStoredProcTable

--FIST ENABLE DATA ACCESS
EXEC sp_serveroption 'TheServerName', 'DATA ACCESS', TRUE

--main.sql calls yStoredProcTable.sql and the calls functionAssembly
SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(SERVERNAME, 'EXEC test.dbo.myStoredProcTable 1')


-- pass the table to assembly
-- how would i pass the table to assembly code?, Is this POSSIBLE?
    EXEC functionAssembly #tmpTable

------------------------------------------ modifier

Réponse suivante @faester: - Comment pourrais-je utiliser XML dans le code, j'ai suggéré d'utiliser le truc numberTOstring, mais je suppose que l'option XML est la meilleure ici ...

Encore une fois, je fais vraiment ça, même si ce n'est pas le meilleur choix ...

Était-ce utile?

La solution

Oui, vous pouvez enregistrer des assemblages, mais c'est rarement une bonne idée en raison de problèmes de performances.

Mais si vous effectuez des calculs numériques complexes ou des opérations similaires sur des valeurs scalaires, cela peut vous donner beaucoup de flexibilité. Mais le problème demeure que SQL est orienté nativement, ce qui n'est pas le cas de C #, vous rencontrerez donc facilement des incompatibilités.

Vous devez également savoir que vous ne pouvez importer que des membres statiques sur des classes statiques.

Mais un exemple Cette classe - qui n'a intentionnellement pas d'espace de noms car il semble impossible d'importer des classes dans un espace de noms.

    public static class Math
    {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static int Add(int a, int b)
        {
            return a + b;
        }


        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void Void(int a, int b)
        {
        }
    }

Il faut un peu de SQL pour préparer le serveur et vous devez probablement être administrateur.

    EXEC SP_CONFIGURE 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    -- CONSIDER: DROP ASSEMBLY SqlClr
    GO
    CREATE ASSEMBLY SqlClr 
    FROM 'pathtoassembly'
    WITH PERMISSION_SET = SAFE;
    GO
    SELECT * FROM sys.assemblies
    GO
    CREATE FUNCTION [MathAdd] (@a int, @b int)
    RETURNS INT 
    AS EXTERNAL NAME [SqlClr].Math.[Add]
    GO 
    CREATE PROCEDURE [Void] @a INT, @b INT
    AS EXTERNAL NAME [SqlClr].Math.[Void]
    GO 
    SELECT dbo.MathAdd (1, 2)
    EXEC void 1, 2

ENCORE: Vous devez vraiment être sûr que vous en avez besoin, c'est rarement une bonne idée! (Je l'ai utilisé une fois pour la validation des e-mails en effectuant des recherches DNS, etc., mais c'était sur un système où toutes les logiques métier étaient écrites en SQL. Et c'est mauvais!)

Quelques références utiles:

http://msdn.microsoft.com/en-us/library/ ms189524.aspx

http://www.codeproject.com/KB/database/CLR_in_Sql_Server_2005.aspx

Autres conseils

Utilisez le SQL CLR pour exécuter la fonction exacte que vous avez décrite.

C'est possible .(Mais lisez les commentaires).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top