Passer le tableau en paramètre dans sql server UDF
Je voudrais passer un tableau en paramètre dans un scaler UDF.
Je voudrais aussi préférez limiter le paramètre de tables avec une seule colonne. (facultatif)
Est-ce possible?
MODIFIER
Je ne veux pas passer un nom de table, je voudrais passer de la table de données (comme une référence, je présume),
MODIFIER
Je veux que mon Scaler UDF essentiellement de prendre une table de valeurs et de retour d'un fichier CSV liste de lignes.
IE
col1
"My First Value"
"My Second Value"
...
"My nth Value"
serait de retour
"My First Value, My Second Value,... My nth Value"
J'aimerais faire un filtrage sur la table mais, c'est à dire s'assurer qu'il n'y a pas de valeurs null et il n'y a pas de doublons. Je m'attendais à quelque chose le long des lignes de:
SELECT dbo.MyFunction(SELECT DISTINCT myDate FROM myTable WHERE myDate IS NOT NULL)
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il n'existe pas de moyen simple de SQL Server 2005. Lukasz réponse est correcte pour SQL Server 2008, bien que la fonctionnalité est long en retard
Toute solution impliquerait de tables temporaires, ou de passer en xml/CSV et l'analyse de l'UDF. Exemple: changement de xml, analyser dans udf
Ce que vous voulez faire dans la plus grande image si? Il y a peut être une autre façon de faire...
Edit: Pourquoi ne pas passer dans la requête comme une chaîne de caractères et l'utilisation d'une procédure stockée avec un paramètre de sortie
Remarque: ceci est un non testé peu de code, et vous auriez besoin de penser à injection SQL etc. Cependant, il répond à vos "colonnes" de l'exigence et de vous aideront à
Vous pouvez, néanmoins, n'importe quelle table. À partir de la documentation:
Vous pouvez utiliser table défini par l'utilisateur types.
Exemple de table défini par l'utilisateur type:
Ce que vous pouvez faire est de définir votre type de table, par exemple
TableType
et de définir la fonction qui prend en paramètre de ce type.Un exemple de fonction:Le paramètre doit être EN lecture seule. Et exemple d'utilisation:
En fonction de ce que vous voulez atteindre, vous pouvez modifier ce code.
EDIT:
Si vous avez des données dans une table, vous pouvez créer une variable:
Et de prendre des données à partir de votre table de la variable
Étape 1: Créer un Type de Tableau avec le nom du tableau tapez acceptant une table ayant une colonne de type varchar
Étape 2: Créer une fonction qui va accepter ci-dessus déclarées tableau tapez comme Paramètre Table et de la Chaîne de Valeur comme Séparateur
Étape 3: Passer à table avec une colonne de type varchar pour le type défini par l'utilisateur tableau tapez et", " comme séparateur dans la fonction
Coupe à la ligne de fond, vous voulez une requête SELECT x à PARTIR de y être passé dans une fonction qui renvoie les valeurs séparées par des virgules chaîne.
Comme cela a déjà été expliqué, vous pouvez le faire en créant un type de table et le passage d'un type défini par l'utilisateur dans la fonction, mais il a besoin d'un multi-ligne de déclaration.
Vous pouvez passer XML autour sans déclarer un tapé table, mais cela semble avoir besoin d'une variable xml qui est encore un multi-instruction de la ligne c'est à dire
L' "POUR XML BRUT" rend le SQL vous donner c'est comme du xml.
Mais vous pouvez contourner la variable à l'aide de Cast(... COMME XML). Ensuite, c'est juste une question de quelques XQuery et un peu de concaténation astuce:
Aussi longtemps que vous utilisez POUR XML CRU tout ce que vous devez faire est de l'alias de la colonne que vous voulez comme Valeur, comme c'est codé en dur dans la fonction.
J'ai eu affaire à une très problème similaire et ont été en mesure de réaliser ce que je cherchais, même si je suis à l'aide de SQL Server 2000. Je sais que c'est une vieille question, mais pense que la validité de son poste ici la solution, car il doit y en avoir d'autres comme moi qui utilisent d'anciennes versions, et encore besoin d'aide.
Voici l'astuce: SQL Server n'accepte pas le passage d'un tableau à une fonction, ni vous pouvez passer une requête T-SQL de sorte que la fonction crée une table temporaire ou même appelle une procédure stockée pour le faire. Donc, au lieu de cela, j'ai créé une table réservée, que j'ai appelé xtList. Ceci permettra de tenir la liste de valeurs (1 colonne, selon les besoins) pour travailler avec.
Ensuite, une procédure stockée pour remplir la liste. Ce n'est pas strictement nécessaire, mais je pense que c'est très utile et les meilleures pratiques.
Maintenant, juste face à la liste de la manière que vous souhaitez, à l'aide de la xtList. Vous pouvez l'utiliser dans une procédure (pour l'exécution de plusieurs commandes T-SQL), les fonctions scalaires (pour récupérer plusieurs chaînes de caractères) ou multi-déclaration de la table des fonctions (récupère les cordes, mais comme il était à l'intérieur d'un tableau, 1 chaîne de caractères par ligne). Pour tout cela, vous aurez besoin de curseurs:
L'action souhaitée serait comme suit, en fonction du type d'objet créé:
Procédures stockées
Fonctions scalaires
Multi-déclaration de la table des fonctions
Pour obtenir le nombre de colonnes sur une table, utilisez ceci:
et de passer un tableau à une fonction, essayez de XML comme le montrent ici:
Suivantes vous permettront de rapidement supprimer les doublons,les valeurs null et ne renvoyer que les valide en tant que liste.
CTE sont valables dans SQL 2005 , vous pouvez stocker les valeurs dans une table temporaire, et l'utiliser avec votre fonction.
PASSER LE TABLEAU EN PARAMÈTRE À UNE PROCÉDURE STOCKÉE
Étape 1:
CREATE TABLE [DBO].T_EMPLOYEES_DETAILS
(
Id de type int,
Nom de type nvarchar(50),
Le genre de type nvarchar(10),
Salaire int
)
Étape 2:
CREATE TYPE EmpInsertType de TABLE
(
Id de type int,
Nom de type nvarchar(50),
Le genre de type nvarchar(10),
Salaire int
)
Étape 3:
/* Doit ajouter un mot clé READONLY à la fin de la variable */
CRÉER PROC PRC_EmpInsertType
@EmployeeInsertType EmpInsertType READONLY
COMME
COMMENCER
INSERT INTO [DBO].T_EMPLOYEES_DETAILS
SÉLECTIONNEZ * à PARTIR de @EmployeeInsertType
FIN
Étape 4:
DECLARE @EmployeeInsertType EmpInsertType
INSERT INTO @EmployeeInsertType values(1,'Jean','Hommes',50000)
INSERT INTO @EmployeeInsertType de VALEURS(2,'Praveen", "Homme", 60000)
INSERT INTO @EmployeeInsertType VALEURS(3,'Chitra','Femme',45000)
INSERT INTO @EmployeeInsertType VALEURS(4,'Mathy','Femme',6600)
INSERT INTO @EmployeeInsertType VALEURS(5,'Sam','Hommes',50000)
EXEC PRC_EmpInsertType @EmployeeInsertType
=======================================
SÉLECTIONNEZ * À PARTIR DE T_EMPLOYEES_DETAILS
SORTIE
1 Jean Mâle 50000
2 Praveen Mâle 60000
3 Chitra Femme 45000
4 Mathy Femme 6600
5 Sam Mâle 50000
vous pouvez faire quelque chose comme ceci
/* CRÉER UN TYPE DE TABLE DÉFINI PAR L'UTILISATEUR */
/*CRÉER UNE FONCTION QUI PREND LE TABLEAU EN PARAMÈTRE */
/*CRÉER UNE PROCÉDURE STOCKÉE QUI PREND LE TABLEAU EN PARAMÈTRE */
Pour plus de détails, consultez ce lien: http://sailajareddy-technical.blogspot.in/2012/09/passing-table-valued-parameter-to.html