2016-03-29 4 views
1

Mein aktuelles Ziel ist die Erstellung einer dynamischen Auswahl und wo Abfrage. In unserem Fall haben wir eine Referenztabelle. Die Referenztabelle enthält Referenzen, Spaltenwerte und Tabellennamen. Wir erstellen eine dynamische Abfrage für die anderen Tabelle (n) mit diesen Referenzen. Beispiel:Was ist die beste Praxis für große dynamische Auswahl und wo Abfrage

select * from {table} where {pk1} in (...) and {pk2} in {...} 

Bei dieser generierten Abfrage ist ein Problem aufgetreten. Das Problem ist, dass einige Zeilen im Ergebnis zurückgeben, aber sie sind nicht in Abfrage, weil in Abfragen unterschiedliche Bedingungen sind.

Geänderte SQL Generation gefällt dieses

select * from {table} where ({pk1}=(value1) and {pk2}=(value2)) or ({pk1}=(value3) and {pk2}=(value4)) ...) 

In diesem Fall wird das Problem gelöst wurde, aber Abfrageausführungszeit ist nicht gut anstelle von „IN“ Abfrage. Es ist etwa 10-20 mal langsamer. Und die Abfragezeichenfolge zu groß anstelle von "IN" -Abfrage.

Wir können die Abfragen mit Tabellenwert nicht verwenden, da wir keinen neuen TYPE für jede Tabelle dynamisch erstellen können und die Spalten nicht den gleichen Typ und die gleiche Reihenfolge haben. In Zukunft können neue Tabellentypen eingefügt werden.

Also, was ist die beste Praxis, dies zu tun?

Grüße

+0

Wie viel Wert gibt es "in" -Klausel? Zum Beispiel {pk1} in (1, 2, 3, ......, 10000) –

+0

Es hängt von der referenzierten Tabelle ab derzeit ca. 50.000 Zeilen in einer einzigen Tabelle –

Antwort

-1

Ich denke, können Sie temporäre Tabelle für "in" Anweisung wie folgt verwenden,

IF (OBJECT_ID('tempdb..#tid') IS NULL) 
    BEGIN 
    CREATE TABLE #tid(Id BIGINT); 
    INSERT INTO #tid (Id) VALUES (1), 
     (2), 
     (3), 
     (4), 
     (5), 
     (6), 
     (7), 
     (8), 
     --...... 
     (10000); 
    END 
select * from {table} where {pk1} in (SELECT Id FROM #tid); 

diese Nutzung schneller als „in (1,2,3,4, ... 10000)

+0

Er/Sie fragt nach SELECT-Anweisungen.Für INSERT- und UPDATE-Anweisungen können Sie Stapel verwenden. –

Verwandte Themen