none
Create funktion in TSQL Model RRS feed

  • Frage

  • Hallo zusammen,

    Ich erstelle im Moment über eine C# Anwendung mit Hilfe des Microsoft DacFx NuGet Paket eine bzw. mehrere SQL Tabellen. Für die Tabellenwerte sind mehrere Constraints angelegt.

    Soweit kein Problem.

    Mein Problem ist das Anlegen einer SQL Funktion die aus einem xml string einen entsprechenden Wert ermittelt.

    Das funktionierende SQL Statement sieht dazu wie folgt aus:

    CREATE FUNCTION [schema].[getValue] (@xmlParameter XML) 
    
    RETURNS nvarchar(10)
    
    AS 
    
    BEGIN 
    
    return cast(@xml.query('declare namespace ns="http://GetValue"; local-name((/ns:value/*)[1])') as nvarchar(10));
    
    end
    
    GO


    Aktuell lege ich zuerst mit CreateFunctionStatement das entsprechende Statement an und weise Namen und Rückgabetyp zu:

    var getValueFunctionStatement = new CreateFunctionStatement();
    
    getValueFunctionStatement.Name = TsqlHelper.SchemaObjectName("getValue", "schema");
    
    getValueFunctionStatement.ReturnType = new ScalarFunctionReturnType { DataType = new SqlDataTypeReference { Parameters = { NVarCharLength10.AsLiteral() }, SqlDataTypeOption = SqlDataTypeOption.NVarChar } };


    Den XML Übergabeparameter habe ich wie folgt definiert:

    var parameter = new ProcedureParameter { DataType = new XmlDataTypeReference(), VariableName = new Identifier { Value = "xmlParameter", QuoteType = QuoteType.NotQuoted}, Nullable = new NullableConstraintDefinition { Nullable = false } };
    
    getValueFunctionStatement.Parameters.Add(parameter);


    Im Weiteren bin ich mir nicht mehr sicher ob die Definitionen stimmen:

    var returnStatement = new ReturnStatement();
    
    var castCall = new CastCall();
    
    castCall.DataType = new SqlDataTypeReference { Parameters = { NVarCharLength10.AsLiteral() }, SqlDataTypeOption = SqlDataTypeOption.NVarChar };      

         
    // hier sollte der CastCall definiert werden
    
    returnStatement.Expression = castCall;
    
    getValueFunctionStatement.StatementList = new StatementList();
    
    getValueFunctionStatement.StatementList.Statements.Add(returnStatement);


    Wie definiere ich die Query an dem XML Übergabeparameter und die Zuweisung des Ergebnisses an den CastCall?

    Mit freundlichen Grüßen

    ObiLanKenobi


    Freitag, 20. September 2019 07:35

Antworten

  • Dein Problem ist, dass der XML-Datentyp ein SQL-Datentyp ist und keine Entsprechung in C# hat.
    Dort ist XML ein Objekt mit hierarchischer Node-Struktur.

    https://docs.microsoft.com/de-de/sql/t-sql/xml/xml-transact-sql?view=sql-server-2017

    Mach für deine Parameter eifach ein NVARCHAR und im Function-Code ein "cast(parametervar as xml)".
    Bewegt sich die Funktion ausschließlich im SQL-Umfeld (also z.B. Select MyXmlFunc(MyXmlColumn) from MyTable) stellt sich das Problem natürlich nicht.

    Samstag, 21. September 2019 13:24