0
votes

Comment puis-je diviser le chemin de répertoire vers le niveau 5 de SQL Server?

J'ai besoin d'analyser le répertoire à 5 niveau dans SQL Server avec une fonction de chaîne.

\ABC\BC\ADS\ADS\123\
\ABC\BC\ADS\ADS\156\
\ABC\BC\ADS\ADS\179\


5 commentaires

Veuillez me suggérer une fonction que je peux utiliser dans SQL Server.


Cela va être difficile à balancer sans support de regex (ce qui tristes SQL Server n'est pas vraiment expédié avec ... encore). Vous voudrez peut-être gérer cela dans votre couche d'application.


Peut-être que c'est possible avec la requête.


Donc, ces enregistrements sont dans une colonne


Quelle est la version SQL Server?


3 Réponses :


0
votes

Vous pouvez essayer cela. En utilisant string_split code>, vous pouvez convertir votre chaîne en lignes, puis recherchez les enregistrements supérieurs en tant que besoin dans votre code pour obtenir le résultat souhaité.

Après cette utilisation Stuff code> à nouveau concaténer dans une seule chaîne et obtenir votre sortie. p> xxx pré>

Vous pouvez créer votre propre fonction code> divisée code> pour vous assurer que la commande ne changera pas dans l'analyse . P>

GO

CREATE FUNCTION [dbo].[Split]
(@String nvarchar(max), @Delimiter char(1))
RETURNS @Results TABLE (Items varchar(200))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(max)
-- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
--     ERO FIRST TIME IN LOOP
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
-- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
-- PUT THE ITEM INTO THE RESULTS SET
INSERT INTO @Results(Items) VALUES(@SLICE)
-- CHOP THE ITEM REMOVED OFF THE MAIN STRING
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- BREAK OUT IF WE ARE DONE
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
GO




1 commentaires

Documentation sur string_split stipule que ... Les rangées de sortie peuvent être dans n'importe quel ordre. La commande n'est pas garantie de correspondre à l'ordre des substrings dans la chaîne d'entrée ... . Je ne suis pas sûr que string_split est une option ici.



1
votes

Si vous êtes autorisé à créer une fonction de base de données, vous pouvez atteindre vos données requises.

Créer une fonction: strong> p> xxx pré>

ceci ci-dessus La fonction retournera la nième position d'un caractère dans la chaîne fournie. Au fur et à mesure que vous avez besoin du chemin jusqu'au niveau 5, j'ai trouvé la 6ème position de caractère "\" et conserve la chaîne jusqu'à cette position à l'aide de la méthode de sous-chaîne. P>

SELECT SELECT: FORT> P>

SELECT 
SUBSTRING
(
    <db column name>,
    1,
    CASE
        WHEN [dbo].[find_nth_char_position]('\',<db column name>,6) = 0 THEN LEN(<db column name>) 
        ELSE [dbo].[find_nth_char_position]('\',<db column name>,6)
    END
)
FROM <your_table>


7 commentaires

Mkrabbani ... Cela fonctionne, mais le problème est que le niveau n'est que 3 ou de niveau, alors il n'est pas donné en sortie.


Attendez une minute .. Changer la logique.


@Pragnehprajapati pouvez-vous vérifier maintenant?


Cela donne une erreur .... Type de données d'argument Nvarchar (MAX) n'est pas valide pour l'argument 3 de la fonction de sous-chaîne.


Désolé pour la confusion @pragnehprajapati. Mise à jour de la définition de la fonction et sélectionnez Script. S'il vous plaît essayez après modifier votre fonction en conséquence.


:( Pouvez-vous vérifier cette sortie de violon - dbfiddle.uk/...


Son travail comme prévu chez moi et dans le dbfiddle aussi. @PAGNESHPRAJAPATI



1
votes

Vous pouvez essayer avec l'approche suivante:

Tableau: xxx

Énoncé: xxx

sortie: xxx


0 commentaires