none
להוציא חלקים מstring RRS feed

  • שאלה

  • אני עוסק בניטור של sybase 
    ולפי מה שאני רואה הוא אבטיפוס של sql server

    אני רוצה לעשות בדיקה ולהוציא ממנה סטרינג ומתוכו להוציא כמה חלקים
    תתייחסו לבדיקה כאילו היא בtsql
    הבדיקה היא @@version (ממש כמו sql server)

    היא מוציאה סטריג כזה : 

    'Adaptive Server Enterprise/15.7.0/EBF 19808 SMP ESD#01 /P/NT (IX86)/Windows 2008 R2/aseasap/2918/32-bit/OPT/Wed Feb 08 04:07:02 2012'

    אני רוצה שיהיה דלימיטר כזה: (/)

    ולפיו אני אוכל להוציא רק חלק מהסטרינג כלומר

    החלק הראשון החמישי והשישי:

    Adaptive Server Enterprise

    NT (IX86)

    Windows 2008 R2

    הבדיקה משתנה בין מחשב למחשב ככה 

    ויכול להיות שבמחשב אחר יהיה רשום לינוק ולא ווינדוס אז האורך של הסטרינג הוא לא קבוע

    תודה על כל עזרה שתהיה

    יום רביעי 11 יוני 2014 11:33

תשובות

  • היי נתנאל, מצורף סקריפט ליצירת פונקציה שתעשה מה שביקשת. 

    הפונקציה מקבלת 2 פרמטרים:

    • הסטרינג, שיכול להיות שורה מטבלה.
    • דלמיטר, שהוא מוגדר אישית. יכול להיות "/" או "," או כל מה שתחפוץ בו.

    הפוקנציה מחזירה את הערכים בצורה טבלאית מופרדים בשורות עם מספור בעזרת IDx. כך שכדי לענות לדרישה שלך נבצא שאילתא כזאת:

    SELECT Word
    FROM  [dbo].[Word_list] ('Adaptive Server Enterprise/15.7.0/EBF 19808 SMP ESD#01 /P/NT (IX86)/Windows 2008 R2/aseasap/2918/32-bit/OPT/Wed Feb 08 04:07:02 2012', '/')
    WHERE IDX IN (0,4,5)

    התוצאה שתחזור לנו:

    Word
    Adaptive Server Enterprise
    NT (IX86)
    Windows 2008 R2

    כמובן שלפי השאילתא שתרכיב, תוכל להחזיר איזה ערכים שתרצה מהסטרינג.

    CREATE FUNCTION [dbo].[Word_Delimiter]
        (
          @line VARCHAR(MAX) ,
          @delimiter VARCHAR(10)
        )
    RETURNS @word_list TABLE
        (
          Idx INTEGER IDENTITY(0, 1) ,
          Word VARCHAR(8000)
        )
        BEGIN
            DECLARE @start SMALLINT ,
                @end SMALLINT ,
                @total_length SMALLINT ,
                @word_num SMALLINT ,
                @number_of_properties SMALLINT ,
                @exit_loop BIT ,
                @word VARCHAR(8000)
    
            SET @total_length = LEN(@line)
            SET @start = 1
            SET @end = CHARINDEX(@delimiter, @line, @start)
            SET @exit_loop = 0
     
     
            WHILE @exit_loop = 0 
                BEGIN
                    IF @end > 0 
                        SET @word = SUBSTRING(@line, @start, @end - @start)
                    ELSE 
                        BEGIN
                            IF @total_length > @start - 1 
                                SET @word = SUBSTRING(@line, @start,
                                                      @total_length - ( @start - 1 ))
                            SET @exit_loop = 1
                        END
                    SET @start = @end + 1
                    SET @end = CHARINDEX(@delimiter, @line, @start)
                    SET @word = LTRIM(RTRIM(@word)) 
                    IF @word > ' ' 
                        BEGIN
                            INSERT  @word_list
                                    ( Word )
                            VALUES  ( @word )
                            SET @word = ''
                        END
                END
            RETURN
        END

    תהנה!


    • נערך על-ידי Omri Fadida יום חמישי 12 יוני 2014 07:13
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 15 יוני 2014 10:33
    יום חמישי 12 יוני 2014 07:12

כל התגובות

  • היי נתנאל, מצורף סקריפט ליצירת פונקציה שתעשה מה שביקשת. 

    הפונקציה מקבלת 2 פרמטרים:

    • הסטרינג, שיכול להיות שורה מטבלה.
    • דלמיטר, שהוא מוגדר אישית. יכול להיות "/" או "," או כל מה שתחפוץ בו.

    הפוקנציה מחזירה את הערכים בצורה טבלאית מופרדים בשורות עם מספור בעזרת IDx. כך שכדי לענות לדרישה שלך נבצא שאילתא כזאת:

    SELECT Word
    FROM  [dbo].[Word_list] ('Adaptive Server Enterprise/15.7.0/EBF 19808 SMP ESD#01 /P/NT (IX86)/Windows 2008 R2/aseasap/2918/32-bit/OPT/Wed Feb 08 04:07:02 2012', '/')
    WHERE IDX IN (0,4,5)

    התוצאה שתחזור לנו:

    Word
    Adaptive Server Enterprise
    NT (IX86)
    Windows 2008 R2

    כמובן שלפי השאילתא שתרכיב, תוכל להחזיר איזה ערכים שתרצה מהסטרינג.

    CREATE FUNCTION [dbo].[Word_Delimiter]
        (
          @line VARCHAR(MAX) ,
          @delimiter VARCHAR(10)
        )
    RETURNS @word_list TABLE
        (
          Idx INTEGER IDENTITY(0, 1) ,
          Word VARCHAR(8000)
        )
        BEGIN
            DECLARE @start SMALLINT ,
                @end SMALLINT ,
                @total_length SMALLINT ,
                @word_num SMALLINT ,
                @number_of_properties SMALLINT ,
                @exit_loop BIT ,
                @word VARCHAR(8000)
    
            SET @total_length = LEN(@line)
            SET @start = 1
            SET @end = CHARINDEX(@delimiter, @line, @start)
            SET @exit_loop = 0
     
     
            WHILE @exit_loop = 0 
                BEGIN
                    IF @end > 0 
                        SET @word = SUBSTRING(@line, @start, @end - @start)
                    ELSE 
                        BEGIN
                            IF @total_length > @start - 1 
                                SET @word = SUBSTRING(@line, @start,
                                                      @total_length - ( @start - 1 ))
                            SET @exit_loop = 1
                        END
                    SET @start = @end + 1
                    SET @end = CHARINDEX(@delimiter, @line, @start)
                    SET @word = LTRIM(RTRIM(@word)) 
                    IF @word > ' ' 
                        BEGIN
                            INSERT  @word_list
                                    ( Word )
                            VALUES  ( @word )
                            SET @word = ''
                        END
                END
            RETURN
        END

    תהנה!


    • נערך על-ידי Omri Fadida יום חמישי 12 יוני 2014 07:13
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 15 יוני 2014 10:33
    יום חמישי 12 יוני 2014 07:12
  • תודה רבה

    עזרת לי מאוד

    יום רביעי 18 יוני 2014 14:20
  • בכיף! שמחתי לעזור. 
    יום ראשון 22 יוני 2014 22:08