2009-12-02 12 views
5

So, hier ist der Deal. In unserer Datenbank wickeln wir die meisten unserer Lesevorgänge (d. H. SELECT-Anweisungen) aus Gründen der Sicherheit und Modularität in Tabellenwertfunktionen ab. Also habe ich einen TVF, der einen oder mehrere optionale Parameter definiert.So übergeben Sie Standardschlüsselwort für Tabellenwertfunktionsaufruf in ADO.NET

ich ein TVF mit mit notleidenden Parameter glauben beauftragt die Verwendung des Keyword-default wenn die TVF Aufruf wie folgt:

select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

ist das in Ordnung, alles in der Query Analyzer funktioniert, aber wenn es darum geht, Zeit, um tatsächlich Wenn ich diese Anfrage von ADO.NET mache, bin ich nicht sicher, wie man einen SQL-Parameter erstellt, der das Wort default in den gerenderten SQL-Code setzt.

Ich habe in etwa so etwas wie dies jetzt:

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

So bekam jemand irgendwelche Ideen, wie default an die TVF passieren?

+1

beste Lösung, die ich gesehen habe, so weit zu vermeiden, ist die Standardklauseln in Definieren Sie die TVF-Parameter, geben Sie Nullen wie von Kevin vorgeschlagen ein, und erstellen Sie manuell Standardwerte in Ihrem TVF-Hauptteil. Hier ist ein Artikel, den ich gefunden habe (es geht um Sprocs, aber das Problem ist das gleiche). http://social.msdn.microsoft.com/Forums/de/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 Wie bei allen anderen mit Microsoft verbundenen Dingen, wird die Hälfte davon zur Arbeit kommen Problemumgehung – Mason

Antwort

0

Sie können Null als Parameterwert übergeben.

Dieser Artikel zeigt Beispiele: http://support.microsoft.com/kb/321902

+0

Danke, ich werde das versuchen, aber ich bin mir ziemlich sicher, dass das Übergeben eines expliziten NULL einfach die in der tvf-Definition definierten Voreinstellungen überschreibt und die Voreinstellungen nutzlos macht. – Mason

+0

Ich würde gerne Ihre Ergebnisse hören. Ich bin erstaunt, dass ich das nie wissen musste, bevor ich Ihre Frage sah. Ich würde immer noch erwarten, dass Null funktioniert und dass DBNull die Definition des Parameters überschreiben würde. –

+0

Ja, ich habe gerade überprüft, das ist nicht gut. Und der Grund ist, weil es einen Unterschied zwischen: select * from fn_SampleTVF (123, DEFAULT) und select * from fn_SampleTVF (123, null) Dank though. – Mason

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Sie nicht über Code (Der optionale Parameter) für Standard haben hinzuzufügen. SQL Server verwendet den Standard, wie er in Ihrer UDF definiert ist. Allerdings, wenn Sie dann anderen Wert zu übergeben möchten, können Sie weitergeben:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

Außerdem scheint es (aus meinen bisherigen Tests) nicht einmal den Datentyp anzugeben; Sie können also sagen: command.Parameters.Add (neuer SqlParameter ("@ OptionalParam", null)); ...und das [null] wird als [default] gedeutet. – tbone

+1

BEARBEITEN: mein vorheriger Kommentar ist falsch: [null] ist ** nicht ** interpretiert als [Standard] – tbone

+0

Ok, nach noch mehr Tests, zumindest mit der aktuellen Framework-Version Ich verwende, Hinzufügen des Parameters ohne Angabe eines Wertes führt NICHT dazu, dass der Standardwert verwendet wird. Der Aufruf von SSMS mit [default] führt nicht zu demselben Ergebnis wie die Übergabe des Parameters ohne Wert, obwohl dies das implizierte Verhalten hier ist: https://msdn.microsoft.com/de-de/library/system.data. sqlclient.sqlparameter.value% 28v = vs.110% 29.aspx – tbone

1

Ich hätte so getan haben:

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
}