2016-10-13 11 views
3

現在カラム値分割SQL文字列値

(以下ここで値が動的に変化して、一時テーブルからの列の値である)

45 | 00055 | 9/30/2016 | Vodafone | Randy Singh | Newyork | Test Msg | TBL101 | PC | 1.00 | COMP101 | CS | 1.00.............. etc 

試験後7 PIPE、すなわちに基づいて分割する必要がありますメッセージ

出力は

文字列1

する必要があります

(第2文字列として)

列2

TBL101 | PC | 1.00 | COMP101 | CS | 1.00......... etc 

機能

CREATE FUNCTION dbo.SUBSTRING_INDEX 
(
    @str NVARCHAR(4000), 
    @delim NVARCHAR(1), 
    @count INT 
) 
RETURNS NVARCHAR(4000) 
WITH SCHEMABINDING 
BEGIN 
    DECLARE @XmlSourceString XML; 
    SET @XmlSourceString = (SELECT N'<root><row>' + REPLACE((SELECT @str AS '*' FOR XML PATH('')) , @delim, N'</row><row>') + N'</row></root>'); 
RETURN STUFF 
(
    ((
     SELECT @delim + x.XmlCol.value(N'(text())[1]', N'NVARCHAR(4000)') AS '*' 
     FROM @XmlSourceString.nodes(N'(root/row)[position() <= sql:variable("@count")]') x(XmlCol) 
     FOR XML PATH(N''), TYPE 
    ).value(N'.', N'NVARCHAR(4000)')), 
    1, 1, N'' 
); 
END 

GO

DECLARE @EmpId NVARCHAR(1000) 
select @EmpId = temp from OMSOrderTemp 


SELECT dbo.SUBSTRING_INDEX(@EmpId, N'|', 7) AS Result;e 

ここでの検索結果にのみstring1が表示され、最初の行。あなたと幸せのために

+1

使用している特定のデータベースのタグを追加してください。 –

+0

一般的には、データベースからデータベースまで様々な文字列関数がありますので、適切な答えを得るために使用しているDBMSにタグを付けます。 –

+0

whileループとcharindexを使用してテーブルに格納します。 –

答えて

1

支出時間はソリューションが付属して、私は独自のロジックを使用して機能を変更していることをあなたはこれを試すことができます。この機能は、これを呼び出すには、表

CREATE FUNCTION dbo.SUBSTRING_INDEX 
(
    @str NVARCHAR(4000), 
    @delim NVARCHAR(1), 
    @count INT 
)RETURNS @rtnTable TABLE 
(
    FirstString NVARCHAR(2000), 
    SecondString NVARCHAR(2000) 
) 
AS 
BEGIN 
    DECLARE @cnt INT=1; 
    DECLARE @subStringPoint INT = 0 
    WHILE @cnt <[email protected] 
    BEGIN 
      SET @subStringPoint=CHARINDEX(@delim,@str,@subStringPoint)+1 
      SET @[email protected]+1 
    END 

    INSERT INTO @rtnTable 
    SELECT SUBSTRING(@str,0,@subStringPoint-1) ,SUBSTRING(@str,@subStringPoint+1,LEN(@str)) 
    RETURN 
END 

を返します。すなわち、これは、テーブル値関数であります機能

DECLARE @s varchar(MAX)='45 | 00055 | 9/30/2016 | Vodafone | Randy Singh | Newyork | Test Msg | TBL101 | PC | 1.00 | COMP101 | CS | 1.00' 
SELECT * FROM dbo.SUBSTRING_INDEX (@s,'|',7) 

この意志は、2つの列出力

45 | 00055 | 9/30/2016 | Vodafone | Randy Singh | Newyork | Test Msg TBL101 | PC | 1.00 | COMP101 | CS | 1.00 
+0

お元気です。しかし、入力値を表の列の値として指定すると機能しません。 私は以下のようにあなたの関数を使用しています。 – Somashekhar

+0

DECLARE @s NVARCHAR(1000) 選択@s = TempDataを dbo.SUBSTRING_INDEX_1 FROM SELECT *(@s、N '|'、7)から一時 一時はTempDataを表から列 – Somashekhar

1

Fを与えます@JaydipJとほぼ同じ解決策を内在しています。私は別の方法で実装すると思ったけど、次はWhileループを使用して実行する必要があります。

DECLARE @str VARCHAR(1000), 
     @str1 VARCHAR(1000), 
     @str2 VARCHAR(1000), 
     @pos INT, 
     @counter INT 

SET @str = '45 | 00055 | 9/30/2016 | Vodafone | Randy Singh | Newyork | Test Msg | TBL101 | PC | 1.00 | COMP101 | CS | 1.00.............. etc' 

SET @counter = 0 
SET @pos = 0 

WHILE @counter < 7 
BEGIN 
SET @pos = CHARINDEX('|', @str, @pos + 1) ---- Gets the position of delimiter '|' 
SET @counter = @counter + 1 ---- Increments the counter on the given counter value 
END 

SET @str1 = SUBSTRING(@str, 1, @pos) ---- Splits the string on the 7th position of delimiter '|' 
SET @str2 = SUBSTRING(@str, @pos + 1, LEN(@str) - @pos) ---- Splits the rest of the string 

Print 'str1='+ @str1 
Print 'str2='+ @str2 

SELECT @str1 AS String1, @str2 AS String2 

Whileループは、文字列を反復処理するために使用してDelimiter位置を取得し、それが文字列を分割しています。

+0

おかげでチームメイトです。 !!ここで動的値として@strを渡す必要があります。 – Somashekhar

+0

strとcounterの先頭に変数を宣言するだけです。動的な値に対しては正常に動作します。 の場合、静的な値が与えられます。ちなみに、@ JaydipJさんの答えは、最初の回答を記入してお答えすることをお勧めします。それは本当にコミュニティの良い兆候です。 –

+0

AT-2016 与えられたコードを使って割り当てようとしています。 SELECT @Str = [temp] FROM TempTable。 1つの値しか与えていませんが、テーブルには多くの結果値が含まれています。 – Somashekhar