1. 程式人生 > >SQL Server 根據分隔符擷取指定位置的子字串

SQL Server 根據分隔符擷取指定位置的子字串

--擷取分隔符之間的字串
--ChristopherChen 20160804

USE TSQL2012;
IF OBJECT_ID('dbo.StringTest', 'U') IS NOT NULL
	DROP Table dbo.StringTest;
GO

CREATE TABLE dbo.StringTest
(
UserId INT NOT NULL PRIMARY KEY,
NotificationUsers NVARCHAR(4000) NOT NULL
);

INSERT INTO dbo.StringTest VALUES
(7652,'G:q2p9e36a-79f1-4ac7-a869-db70917fa49e:
[email protected]
'); --法一, 通過遊標擷取相應的字串 DROP TABLE #t1; CREATE TABLE #t1 ( UserId INT NOT NULL, NotificationUsers NVARCHAR(4000) NOT NULL ); DECLARE @UserId INT, @NotificationUser VARCHAR(4000),@NewList VARCHAR(4000); DECLARE N_Cursor CURSOR FOR SELECT UserId, NotificationUsers FROM dbo.StringTest OPEN N_Cursor FETCH NEXT FROM N_Cursor INTO @UserId, @NotificationUser WHILE @@FETCH_STATUS =0 BEGIN SET @Newlist = ''; WHILE CHARINDEX('|',@NotificationUser)>0 BEGIN SET @NewList = @NewList + stuff(LEFT(@NotificationUser,CHARINDEX('|',@NotificationUser)-1),1, 39,'') + ',' SET @NotificationUser=STUFF(@NotificationUser,1,CHARINDEX('|',@NotificationUser),'') END SET @NewList = @NewList + stuff(@NotificationUser,1,39,'') INSERT #t1 VALUES(@UserId, @NewList) FETCH NEXT FROM N_Cursor INTO @UserId, @NotificationUser END CLOSE N_Cursor; DEALLOCATE N_Cursor; SELECT UserId,NotificationUsers FROM #t1; DROP TABLE #t1; --法二, 通過PARSENAME()函式擷取指定位置的字元 --需要注意的是PARSENAME()原本是為擷取四段式Server連線串或IP設計的,僅支援四段內的以'.'作分隔符的字串;另外PARSENAME函式分段引數依據倒序排列 SELECT UserId --擷取中間部分 ,REPLACE(PARSENAME(REPLACE(REPLACE(NotificationUsers,'.','&'),':','.'),2),'&','.') Id --擷取末端部分 ,REPLACE(PARSENAME(REPLACE(REPLACE(NotificationUsers,'.','&'),':','.'),1),'&','.') Email FROM dbo.StringTest --法三, charindex與substring函式組合擷取字元 --注意表示式charindex(':',NotificationUsers,charindex(':',NotificationUsers)+1)實際取得的是第二個':'的索引值 SELECT NotificationUsers --擷取中間部分 ,substring(NotificationUsers,charindex(':',NotificationUsers)+1,case when charindex(':',NotificationUsers)=0 then len(NotificationUsers) else charindex(':',NotificationUsers,charindex(':',NotificationUsers)+1)-charindex(':',NotificationUsers)-1 end) Id --擷取末端部分 ,right(NotificationUsers,len(NotificationUsers)-charindex(':',NotificationUsers,charindex(':',NotificationUsers)+1)) Email FROM dbo.StringTest --法四, 解析XML WITH CTE AS ( SELECT UserId,NotificationUsers,convert(xml,'<s>'+replace(NotificationUsers,':','</s><s>')+'</s>') NotificationUsersXML from dbo.StringTest ) SELECT * --擷取中間部分 ,NotificationUsersXML.value('(/s)[2]','nvarchar(max)') Id --擷取末端部分 ,NotificationUsersXML.value('(/s)[3]','nvarchar(max)') Email FROM CTE

相關推薦

SQL Server 根據分隔符擷取指定位置字串

--擷取分隔符之間的字串 --ChristopherChen 20160804 USE TSQL2012; IF OBJECT_ID('dbo.StringTest', 'U') IS NOT NULL DROP Table dbo.StringTest; GO CR

SQL Server 根據分隔符依次擷取每個子字串

--根據分隔符擷取字串 'Chris,Nancy,Alvin,Sherman,Erick,Josie,Sonia,Joanna' --法1 根據CHARINDEX函式遞迴求出分隔符在字串中出現的位置,之後根據分隔符擷取字串 --注意:下例中當字元內沒有分隔符時會陷入死迴圈

C strncpy 從指定位置開始擷取指定長度字串方法

char dest[4]; char src[] = {"123456789"}; strncpy(dest, src+3, 3); 輸出結果為 456 strncpy函式中的引數是字串陣列的

SQL Server根據表或視圖批量生成插入語句並BCP導出成文本

lower row 創建 index .sql temp length and 空格 --聲明變量 DECLARE @TableName VARCHAR(100),@RunStr VARCHAR(MAX),@RunRC VARCHAR(MAX),@FinalRun VA

sql server 根據身份證號計算出生日期和年齡的存儲過程

ttl 實現 分享 mst () 需要 poc getdate mtr 我這邊有一個業務,需要客戶填寫身份證號,自動計算他的出生日期和年齡 在sql中,具體的存儲過程實現是這樣的: /********************************************

SQL Server 根據樹狀結構表生成以/號分割的路由字串

很多情況下,我們有必要把樹形結構進行資料梳理。比如,要方便的過濾出一個父節點下的所有子節點等等。。。 這個時候,我們可以生成一個路徑表字符串,在應用時只需要對該字串進行索引即可達成目的。 目標:按圖示的部門結構樹,獲取本身的完整路徑字串。比如,前道工序部門,其部門程式碼為PDTE,上級部門為PD生產部,按

SQL Server根據資料庫表,自動生成insert語句,批量新增

實際工作中,兩個資料庫不在同一臺伺服器上,又需要複製資料庫表時,可以在需要複製的資料庫中建立下面的儲存過程。 CREATE PROCEDURE [dbo].[OutputData] @tablename sysname, @

SQL Server 修改AlwaysOn共享網路位置

標籤:MSSQL/故障轉移 概述   很多人一開始搭建Alwayson的時候對於共享網路位置的選擇不是很重視, 導致後面需要去修改這個路徑。但是怎樣修改這個路徑呢?貌似沒有給出具體的修改選項,但是還是有地方可以進行修改。 資料庫:SQL Server 2014 (SP2)  步驟 在現有

C#下實現SQL SERVER資料庫刪除以指定字串開頭的表或指定日期前的表(SQL語句)

關於C#下實現控制資料庫執行相應操作,基本所有工作全在SQL語句編寫上。嗯,簡述以下基本流程吧:C#下建立與SQL SERVER的連線------寫相應SQL語句------執行相應的SQL語句,完了。一三兩步都是定式,本人都是抄的,所以現在也記不住。至於中間的SQL語句,話

SQL獲取SQL Server 根據表名獲取表的所有列及屬性

select     c.name as [欄位名],t.name as [欄位型別]     ,convert(bit,c.IsNullable)  as [可否為空]     ,convert(bit,case when exists(select 1 from sysobjects where xty

SQL SERVER 根據日期自動生成流水號

----函式中不能使用getdate()函式 ----建立得到當前日期的檢視CREATE VIEW v_GetDateASSELECT nowdate=CONVERT(nvarchar(50),GETDATE(),112)--自動生成訂單編號,長度為14,前8位為年月日,後6

SQL Server中刪除以指定字元開頭的儲存過程

利用上面的程式碼可以輕鬆的刪除資料庫中以指定字元開頭的儲存過程。 create procedure dropproc(@bianliang varchar(100)) as begin declare

如何通過使用 SQL Server 中的 Detach 和 Attach 函式將 SQL Server 資料庫移到新位置(轉載)

如何通過使用 SQL Server 中的 Detach 和 Attach 函式將 SQL Server 資料庫移到新位置 參考概要本文描述如何更改任何 SQL Server 7.0、SQL Server 2000 或 SQL Server 2005 資料庫的資料和日誌檔案的

SQL SERVER根據備份建立一個新庫(圖形使用者介面方式)

一、知識點 完全備份: 備份全部選中的資料夾,並不依賴檔案的存檔屬性來確定備份那些檔案。(在備份過程中,任何現有的標記都被清除,每個檔案都被標記為已備份,換言之,清除存檔屬性)。完全備份也叫完整備份。 差異備份: 差異備份是針對完全備份:備份上一次的完全備份後發生變化

SQL Server根據查詢結果,生成XML檔案

/* 'bcp' 不是內部或外部命令,也不是可執行的程式? 看看在C:/Program Files/Microsoft SQL Server/80/Tools/Binn裡面有沒有bcp.exe這個檔案然後看看path裡面加C:/Program Files/Microsoft SQL Server/80/Too

mysql欄位指定位置插入字串

update  security_user set birthday=  CONCAT(left(birthday,4),'-',right(birthday,LENGTH(birthday)-4))  where LENGTH(birthday)=8 ; updat

0001將字串插入到另一個字串指定位置字串插入到另一個字串指定位置

#include <stdio.h> #include <stdlib.h> int main() {     char t[100],s[100];     int n,m,f,i,l;     scanf("%s

6-4 指定位置輸出字串 (20 分)(附上解析及超重要的點!)

6-4 指定位置輸出字串 (20 分) 本題要求實現一個函式,對給定的一個字串和兩個字元,打印出給定字串中從與第一個字元匹配的位置開始到與第二個字元匹配的位置之間的所有字元。 函式介面定義: char *match( char *s, char ch1, char ch2 );

浙大版《C語言程式設計(第3版)》題目集 - 習題11-5 指定位置輸出字串(20 分)

題目連結:點選開啟連結   題目大意:略。   解題思路:略。   AC 程式碼 char *match( char *s, char ch1, char ch2 ) { char *p=s, *h; int fst=1,

js奇葩需求 第一個引數拆開為陣列 指定位置替換 字串特定位置拆分陣列

比如  '43242 : fsfsdfs : r232:fsfsdf'  這樣的字串  希望得到的結果是['43242', 'fsfsdfs : r232:fsfsdf'] 方法1: str='43242 : fsfsdfs : r232:fsfsdf';