Comment passer une liste séparée par des virgules à une procédure stockée?
J'ai donc une Sybase procédure stockée qui prend 1 paramètre est une liste séparée par des virgules de cordes et exécute une requête dans un() de la clause:
CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)
Comment dois-je appeler ma procédure stockée avec plus de 1 valeur dans la liste?
Jusqu'à présent, j'ai essayé
exec getSomething 'John' -- works but only 1 value
exec getSomething 'John','Tom' -- doesn't work - expects two variables
exec getSomething "'John','Tom'" -- doesn't work - doesn't find anything
exec getSomething '"John","Tom"' -- doesn't work - doesn't find anything
exec getSomething '\'John\',\'Tom\'' -- doesn't work - syntax error
EDIT: j'ai effectivement trouvé cette page qui a une grande référence des différents moyens de pas un tableau à une procédure stockée
source d'informationauteur naumcho
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez Sybase 12.5 ou plus tôt que vous ne pouvez pas utiliser les fonctions. Une solution pourrait être de remplir une table temporaire avec les valeurs et les lire à partir de là.
C'est un peu tard, mais j'ai eu exactement ce problème il y a un moment et j'ai trouvé une solution.
L'astuce est double citant puis habillage de l'ensemble de la chaîne de caractères entre guillemets.
Modifier votre proc pour correspondre à l'entrée de la table à la chaîne.
J'ai eu ce en production depuis ASE 12.5; nous sommes maintenant sur 15.0.3.
Passer la liste séparée par des virgules dans une fonction qui retourne une valeur de la table. Il y a un MS SQL exemple quelque part sur StackOverflow, damné si je peux le voir à l'instant.
Appel avec -
Je devine Sybase devrait être en mesure de faire quelque chose de similaire?
Avez-vous besoin d'utiliser une liste séparée par des virgules? Le dernier couple de d'années, j'ai été prise de ce type d'idée et en le passant dans un fichier XML. L'openxml "fonction" prend une chaîne et le rend comme xml et puis, si vous créez une table temporaire avec les données, il est interrogeable.
Concernant Kevin idée de passer le paramètre à une fonction qui découpe le texte en tableau, voici ma mise en œuvre de cette fonction à partir de quelques années en arrière. Fonctionne un régal.
Répartition du Texte en Mots dans SQL
C'est un moyen rapide et sale méthode qui peut être utile:
Ne sais pas si c'est l'ASE, mais dans SQL Anywhere, le sa_split_list fonction renvoie un tableau à partir d'un fichier CSV. Il a des arguments optionnels pour passer à un autre délimiteur (par défaut, c'est une virgule) et un maxlength pour chaque valeur de retour.
sa_split_list fonction
Le problème avec les appels comme ceci: exec getSomething '"John","Tom"' c'est que c'est le traitement de l' '"John","Tom" " comme une seule chaîne de caractères, il ne correspond à une entrée dans la table '"John","Tom"'.
Si vous ne souhaitez pas utiliser une table temporaire, comme dans Paul réponse, alors vous pourriez utiliser le sql dynamique. (Suppose v12+)
Vous devrez vous assurer que les éléments de @keylist des citations autour d'eux, même s'ils sont des valeurs individuelles.
Cela fonctionne en SQL. Déclarer dans votre GetSomething procédure d'une variable de type XML en tant que tel:
Le corps de la procédure stockée met en œuvre les suivantes:
À partir de SQL, le code qui appelle la SP déclarer et initialiser la variable XML avant d'appeler la procédure stockée:
À l'aide de votre exemple, l'appel à la procédure stockée serait:
J'ai utilisé cette méthode et elle fonctionne très bien. Si vous voulez un test rapide, copier et coller le code suivant à une nouvelle requête et de l'exécuter:
Toucher sur ce que @Abel fourni, ce qui m'a aidé a:
Mon but était de prendre ce que jamais l'utilisateur final d'entrée de SSR et de l'utiliser dans ma clause where comme Dans (SÉLECTIONNEZ)
Évidemment @ICD_VALUE_RPT serait commenté dans ma requête de Dataset.
ensuite dans mon
WHERE
j'ai ajouté:Essayer de cette façon. Sa fonctionne pour moi.