SQL Platzhalter, in DENEN IN Frage, eingefügte Zeichenfolgen scheitern
Als Teil meines jobs, ich brauche, schreibt SQL-Abfragen, um eine Verbindung zu unserem PI-Datenbank. Zum generieren einer Abfrage, die ich brauche, um eine array von tags (im wesentlichen Primärschlüssel), aber diese müssen eingefügt werden als strings.
Werden, es wird eine modulare Abfrage und für mehrere tags, ein Platzhalter verwendet wird.
Die Abfrage stützt sich auf die Verwendung der WHERE-IN-Anweisung, die ist, wo der Platzhalter ist, wie unten:
SELECT SUM(value * 5/1000) as "Hourly Flow [kL]"
FROM piarchive..pitotal
WHERE tag IN (?)
AND time between ? and ?
AND timestep = '1d'
AND calcbasis = 'Eventweighted'
AND value <> ''
Das Problem ist das format, in dem die tags übergeben werden. Wenn ich Sie direkt in die Abfrage (für die Prüfung), gehen Sie auf format (dies sind beispielsweise zahlen): '000000012','00000032','005050236','4560236'
und die Abfrage sieht so aus:
SELECT SUM(value * 5/1000) as "Hourly Flow [kL]"
FROM piarchive..pitotal
WHERE tag IN ('000000012','00000032','005050236','4560236')
AND time between ? and ?
AND timestep = '1d'
AND calcbasis = 'Eventweighted'
AND value <> ''
...und die funktioniert auch.
Wenn ich versuchen, und fügen Sie die gleichen tags in den Platzhalter ein, schlägt die Abfrage fehl. Wenn ich nur noch 1 tag, ohne Anführungszeichen (mit dem Platzhalter), die Abfrage funktioniert.
Warum ist das passiert? Ist es überhaupt um ihn herum?
Es ist für die PI-Datenbank, die von OSIsoft. Es ist nicht wirklich eine relationale DB, aber der OLEDB-Treiber erlaubt die Verwendung von normalen SQL
Pitts: Wenn es keine native dynamic SQL-Unterstützung in PI können Sie erstellen Sie die Abfrage als string, was in der Sprache der Anwendung, die Sie verwenden.
InformationsquelleAutor Alastair Pitts | 2010-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie versuchen, alle die zahlen in die Platzhalter, es wird behandelt als eine einzelne Zeichenfolge, nicht als eine durch Komma getrennte Liste von Elementen. So, es sei denn, Sie geschehen, haben einen Wert in Ihrer Tabelle, die genau übereinstimmt, dass "Zeichenfolge" ist, wird es nie funktionieren.
Sind die Lösungen entweder einen Platzhalter für jeder Element, das Sie brauchen, zu entsprechen (drei items, die drei Platzhalter, für Beispiele), oder nicht verwenden Sie einen Platzhalter, sondern Sie verketten Sie die gesamte SQL-string und ausführen. (Natürlich, das ist nicht empfohlen, aufgrund der Möglichkeit von SQL-injection).
InformationsquelleAutor Michael Todd
Habe ich zugeschlagen, dieses problem vor auf unserer reporting-Lösung, bei der der Benutzer im Stande sein wollen, geben Sie bis zu 5 Werte in der unabhängigen drop-down-Kontrollen. Diese Kontrollen wurden aufgefüllt mit den möglichen Werten und ein NULL-Wert bedeutet "nicht verwenden" (Das erste Steuerelement, nicht das zulassen von NULL-da haben Sie oben auswählen eine Möglichkeit zumindest).
Unsere Abfrage hat das snippet (übersetzt nach Ihrer situation):
Dann, wenn wir den Platz-Inhabern, wir vergeben die Werte aus den Dropdown-Menüs, um Ihren jeweiligen Platz-Halter mit einem VORBEHALT: wenn die Dropdown-enthalten NULL, wir bevölkerten die Platzhalter mit dem Inhalt der ersten drop-down.
So, wenn Sie geben Sie
7,3,1,8,9
Sie am Ende mit:Geben Sie
7,NULL,1,NULL,9
erhalten Sie:und so weiter. Das DBMS, die wir verwendet, ist smart genug, um Zusammenbruch
IN
Aussagen zu Ihrer effizientesten form, bevor diese ausgeführt werden, so gab es keine wirkliche Strafe, es zu tun auf diese Weise. Ihre Laufleistung kann variieren.Ein problem mit dieser Unordnung ist, dass Sie setzen eine Obergrenze für die Anzahl der möglichen Einträge in der
IN
- Klausel aber das ist nicht ein problem in unserer situation.InformationsquelleAutor paxdiablo
Wir fragten den Verkäufer, und bekam diese Antwort, die es uns ermöglicht, übergeben Sie eine durch Komma getrennte Gruppe von tags.
im Grunde tut ein Bündel von string-Vergleiche.
Hoffe, dies ist nützlich, um jemanden
InformationsquelleAutor Alastair Pitts