3 Stimmen

Unterschall: Vergleich von zwei Spalten anstelle eines Eingabeparameters

S ist möglich, das Folgende in Unterschall zu tun.

SELECT * FROM TABLE1

WHERE Spalte1 > Spalte2 oder Spalte1 < Spalte3

Alle Beispiele, die ich gesehen habe, gehen davon aus, dass Sie jetzt einen Wert an die Where-Klausel übergeben. Ich versuche, dies zu tun, ohne eine Ansicht zu erstellen.

Danke

2voto

Wenn es in unserem Stapel ist, kann ich es nicht finden :). Es wäre aber eine gute Sache, sie hinzuzufügen :). Im Moment können Sie eine Inline-Abfrage verwenden, um die von Ihnen geschriebene Anweisung einfach auszuführen (sie benötigt direktes SQL). Ich weiß, es ist hässlich, aber...

Rick - wenn Sie das hinbekommen haben, würde es mich interessieren, wie das funktioniert. "Col2" wird versuchen, zu einem Typ geparst zu werden, und Ihre Abfrage wird fehlschlagen.

0voto

Dwight T Punkte 1387

Es scheint, dass diese Funktion nicht in der aktuellen Version enthalten ist, aber in den Code für die nächste Version aufgenommen wurde.

0voto

Dave Neeley Punkte 3248

Wenn Sie SubSonic 2.1/2.2 verwenden und Zugriff auf den Quellcode haben, können Sie Folgendes anwenden:

SubSonic/SqlQuery/Constraint.cs
(Eine neue Eigenschaft hinzufügen)

public bool ParameterIsTableColumn
{
    get { return ParameterValue is TableSchema.TableColumn ;  }
}

SubSonic/SqlQuery/SqlQuery.cs
(innerhalb der Methode SetConstraintParams)

foreach(Constraint c in qry.Constraints)
{
    if (c.ConstructionFragment == "##" || c.ParameterIsTableColumn)
        continue;

SubSonic/SqlQuery/SqlGenerators/ANSISqlGenerator.cs
(Innerhalb der BuildConstraintSQL-Methode)

//add this at the top of the method
int currentConstraintIndex = query.Constraints.IndexOf(c);

///the statement 'c.ParameterName = ' occurs four times in this method
///use this line the first three times, and a slight variation of it on the fourth
c.ParameterName = (c.ParameterIsTableColumn ? ((TableSchema.TableColumn)c.ParameterValue).QualifiedName : String.Concat(col.ParameterName, currentConstraintIndex));

-1voto

Rick Rat Punkte 1732

Ja, das ist es.

Dim TableList As Generic.List(Of Database.Table1) = _
 New SubSonic.Select().From("Table1"). _
 Where("Col1").IsGreaterThan("Col2"). _
 Or("Col1").IsLessThan("Col3").ExecuteTypedList(Of Database.Table1)()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X