Table-Valued-Parameter in Stored Procedure und Entity Framework 4.0

8

Ich habe eine gespeicherte Prozedur in SQL Server 2008 mit dem Namen 'GetPrices' mit einem Table-Valued-Parameter namens 'StoreIDs'.

Dies ist der Typ, den ich für diesen TVP erstellt habe:

%Vor%

Ich möchte den SP von meinem Entity Framework aus aufrufen. Aber wenn ich versuche, die gespeicherte Prozedur zum EDM hinzuzufügen, erhalte ich den folgenden Fehler:

Die Funktion 'GetPrices' hat am Parameterindex 2 einen Parameter 'StoreIDs' mit dem Datentyp 'Tabellentyp', der nicht unterstützt wird. Die Funktion wurde ausgeschlossen.

Gibt es eine Umgehungsmöglichkeit? Irgendwelche Gedanken?

Fabio

    
Fabio Costa 14.05.2010, 20:19
quelle

4 Antworten

1

Da Sie keinen Tabellenparameter verwenden können, versuchen Sie, einen CSV-Stachel zu übergeben, und lassen Sie die gespeicherte Prozedur für Sie in Zeilen aufteilen.

Es gibt viele Möglichkeiten, eine Zeichenfolge in SQL Server zu trennen. Dieser Artikel behandelt die PROs und CONs von fast jeder Methode:

"Arrays und Listen in SQL Server 2005 und höher, wenn Tabellenwertparameter es nicht schneiden" von Erland Sommarskog

Sie müssen eine Split-Funktion erstellen. So kann eine Split-Funktion verwendet werden:

%Vor%

Ich bevorzuge die Nummer Tabellenansatz, um eine Zeichenfolge in TSQL zu teilen , aber es gibt zahlreiche Möglichkeiten zum Aufteilen von Zeichenfolgen in SQL Server finden Sie im vorherigen Link, der die PROs und CONs der einzelnen Elemente erläutert.

Damit die Numbers Table-Methode funktioniert, müssen Sie diese einmalige Tabellenkonfiguration durchführen, die eine Tabelle Numbers erstellt, die Zeilen von 1 bis 10.000 enthält:

%Vor%

Sobald die Numbers-Tabelle eingerichtet ist, erstellen Sie diese Split-Funktion:

%Vor%

Sie können nun eine CSV-Zeichenfolge ganz einfach in eine Tabelle aufteilen und sich ihr anschließen oder sie verwenden, wie Sie wollen:

%Vor%     
KM. 14.05.2010 20:34
quelle
1

Sie können die Eigenschaft ObjectContext.Connection für verwenden Sie ADO.NET , um Ihre Tabellenwertparameter zu erstellen und zu verwenden. Dies ist möglicherweise nicht akzeptabel, aber wenn Sie diese großartige SQL Server 2008-Funktion und die EF verwenden möchten, scheint dies Ihre einzige Wahl zu sein.

Sie können dann auswählen, den teilweise generierten Objektkontext mit der Methode zu erweitern, die sich um alle Low-Level-ADO.NET-Komponenten kümmert. So:

%Vor%     
nicojs 07.11.2011 19:11
quelle
1

Ich stimme zu, dass die Weitergabe eines CSV-Steins in diesem Fall die beste Lösung ist. Ich möchte einen einfacheren Weg vorschlagen, um csv string zu trennen, ohne Tabellen und Funktionen zu erstellen, indem CTE verwendet wird:

%Vor%     
Pavel Sinkevich 20.11.2012 16:21
quelle
0

Vielleicht möchten Sie über dies bei Microsoft Connect

Update: MS verwendet Connect für Funktionen nicht mehr. Sie verwenden es nur für Fehlerberichte. Um für ein EF-Feature zu stimmen, müssen Sie die EF User Voice Website.

Um für dieses spezifische Problem bei User Voice gehen Sie hier .

    
NotMe 14.05.2010 20:27
quelle