SQL espace réservé dans la OÙ EN cause, les chaînes insérées échouer
Dans le cadre de mes emplois, j'ai besoin pour écrire des requêtes SQL pour vous connecter à notre PI base de données. Pour générer une requête, j'ai besoin de passer un tableau de tags (essentiellement des clés primaires), mais ceux-ci doivent être insérés comme des chaînes de caractères.
Que ce sera un système modulaire de requête et utilisé pour de multiples balises, un espace réservé est utilisé.
La requête s'appuie sur l'utilisation de la OÙ DANS l'énoncé, qui est où l'espace est, comme ci-dessous:
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 <> ''
Le problème est le format dans lequel les marques sont transmis en tant que. Si je les ajouter directement dans la requête (pour les tests), ils vont dans le format (ce sont des numéros par exemple): '000000012','00000032','005050236','4560236'
et la requête ressemble à:
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 <> ''
...qui fonctionne.
Si j'essaie d'ajouter les balises dans l'espace réservé, la requête échoue. Si je n'ajoute 1 tag, pas de guillemets (en utilisant l'espace réservé), la requête fonctionne.
Pourquoi est-ce arrivé? Est-il de toute façon autour d'elle?
C'est pour le PI de la base de données, à partir d'OSIsoft. Ce n'est pas vraiment un relationnel, mais le pilote OLEDB permet l'utilisation de la normale SQL
Pitts: Si il n'y a pas natif SQL dynamique de soutien PI, vous pouvez construire la requête comme une chaîne de caractères dans quelle que soit la langue de l'application que vous utilisez.
OriginalL'auteur Alastair Pitts | 2010-03-15
Vous devez vous connecter pour publier un commentaire.
Lorsque vous essayez de placer tous les chiffres dans l'espace réservé, c'est d'être traités comme une seule chaîne de caractères, non pas comme une liste séparée par des virgules des éléments. Donc, sauf si vous arrive d'avoir une valeur dans la table qui correspond à celle de "chaîne", ça ne fonctionnera jamais.
Les solutions sont soit de l'utilisation d'un espace réservé pour chaque élément dont vous avez besoin pour correspondre à (trois éléments, trois espaces réservés, pour des exemples), ou, ne pas l'utilisation d'un espace réservé et, au lieu de cela, concaténer l'ensemble de la chaîne SQL et de les exécuter. (Bien sûr, ce n'est pas recommandé en raison de la possibilité d'une injection SQL).
OriginalL'auteur Michael Todd
J'ai frappé ce problème avant sur notre solution de création de rapports où l'utilisateur souhaite être en mesure de saisir jusqu'à 5 valeurs en indépendant déroulante des contrôles. Ces contrôles ont été renseignés avec les valeurs possibles et une valeur NULL signifie "ne pas utiliser" (Le premier contrôle ne permettent pas de NULLE puisque vous avez haut, sélectionnez un possibilité au moins).
Notre requête a l'extrait (traduit à votre situation):
Puis, quand nous sommes ensemble jusqu'à la place-titulaires, nous avons attribué les valeurs dans les menus déroulants à leur place de titulaire avec une condition: si la liste déroulante figurant NULLE, nous avons rempli la place de titulaire avec le contenu de la première liste déroulante.
De cette façon, si vous entrez
7,3,1,8,9
, vous vous retrouvez avec:Si vous entrez
7,NULL,1,NULL,9
, vous obtenez:et ainsi de suite. Le SGBD que nous avons utilisé est assez intelligent pour s'effondrer
IN
états à leur forme la plus efficace avant de les exécuter, donc il n'y a pas véritablement de peine à le faire de cette façon. Votre kilométrage peut varier.Un problème avec ce quelque chose est que vous devez définir une limite supérieure pour le nombre d'entrées possibles dans la
IN
clause, mais ce n'est pas un problème dans notre situation.OriginalL'auteur paxdiablo
Nous avons interrogé le vendeur, et j'ai obtenu cette réponse, qui nous permet de passer par une virgule groupe de tags.
essentiellement faire un tas de comparaisons de chaînes.
Espère que ce sera utile à quelqu'un
OriginalL'auteur Alastair Pitts