KontextSQL-WHERE IN aus param oder variable
Wir sind derzeit dabei, eine SQL-Datenbank für die Säuberung und wir haben über eine große Menge von Stored Procedures kommen, die nur geringe Unterschiede zwischen ihnen. Wir möchten sie in einem einzigen Prozess zusammenführen, um die Wartung zu vereinfachen.
Problem
Dies sind nur zwei Beispiele für die Art von gespeicherten Procs sind versuchen wir (tun Anmerkung, diese sind Versionen vereinfacht, nicht die tatsächlichen Procs) zu fusionieren.
Stored Procedure - Aktuelle Buchungen
ALTER PROCEDURE [dbo].[SelectCurrentBookings]
@client_FK INT, @startDate DATETIME, @endDate DATETIME
AS
BEGIN
SELECT ROW_NUMBER() OVER (ORDER BY [Booking].[bookingDateTime]) [RowNumber],
[Booking].[booking_PK] [Booking ID],
[Booking].[bookingDateTime] [Booking Date],
[Booking].[bookingDuration] [Duration],
[Booking].[client] [Client Name],
CASE WHEN [Booking].[bookingStatusCode_FK] IN (4,8,9,7,16) THEN 1 ELSE 0 END [Unserviced],
FROM [Booking]
WHERE [client_FK] = @client_FK
AND [Booking].[bookingStatusCode_FK] IN (1,2,14,17)
AND [Booking].[bookingDateTime] >= @startDate
AND [Booking].[bookingDateTime] < DATEADD(d,1,@endDate)
AND [Booking].[deleted] = 0
END
Stored Procedure - archivierten Buchungen
ALTER PROCEDURE [dbo].[SelectArchivedBookings]
@client_FK INT, @startDate DATETIME, @endDate DATETIME
AS
BEGIN
SELECT ROW_NUMBER() OVER (ORDER BY [Booking].[bookingDateTime]) [RowNumber],
[Booking].[booking_PK] [Booking ID],
[Booking].[bookingDateTime] [Booking Date],
[Booking].[bookingDuration] [Duration],
[Booking].[client] [Client Name],
CASE WHEN [Booking].[bookingStatusCode_FK] IN (4,8,9,7,16) THEN 1 ELSE 0 END [Unserviced],
FROM [Booking]
WHERE [client_FK] = @client_FK
AND [Booking].[bookingStatusCode_FK] IN (1,2,14,4,9,7,16,13)
AND [Booking].[bookingDateTime] >= @startDate
AND [Booking].[bookingDateTime] < DATEADD(d,1,@endDate)
AND [Booking].[deleted] = 0
END
Der Code, der die gespeicherten Procs ruft in VB.NET
Dim Command As DbCommand = _db.GetStoredProcCommand("SelectCurrentBookings")
_db.AddInParameter(Command, "client_FK", DbType.Int32, ClientID)
_db.AddInParameter(Command, "startDate", DbType.DateTime, StartDate)
_db.AddInParameter(Command, "endDate", DbType.DateTime, EndDate)
Return _db.ExecuteDataSet(Command)
Wie Sie sehen können, besteht der einzige Unterschied zwischen den oben gespeicherten Prozeduren in den Werten, die dem WHERE IN übergeben werden.
Gibt es eine Möglichkeit für uns, dies zu ändern und die Liste der Werte über einen Parameter oder eine Variable zu liefern?
Sie können [Tabellenwerte] (https://msdn.microsoft.com/en-us/library/bb675163%28v=vs.110%29.aspx) verwenden. In diesem Fall würden Sie zuerst den Tabellenwert in VB füllen (z. B. mit 4 Zeilen 1,2,14,17) und die IN-Klausel durch eine Verknüpfung zu diesem Tabellenwert-Parameter ersetzen. In meinem Link finden Sie einige Beispiele dafür. –
Beachten Sie, dass "SQL Server keine Statistiken zu Tabellenwerten verwaltet". Die Abfragepläne können verrückt werden. –
@AlexB. Vielen Dank für diesen Vorschlag, ich bin mir nicht sicher, ob ich das richtig verstehe, aber würde das nicht zu Nebenläufigkeitsproblemen führen? Auch Michael erklärte, dass Abfragepläne damit verrückt werden könnten, was für uns auch nicht ideal ist. – theoriginalbit