I have a column Permission
of type varchar
. I want to split the data into multiple rows like below... I need help..
Note: remove the dashes between numbers
I have a column Permission
of type varchar
. I want to split the data into multiple rows like below... I need help..
Note: remove the dashes between numbers
I did as follows:
DECLARE @TEST TABLE (USERID INT,PERMISSION VARCHAR(MAX))
INSERT INTO @TEST VALUES (1,'1-2-3-4-5-6-7-8-9-10-11-'),(2,'1-2-4-7-8-9')
DECLARE @RESULT TABLE (USERID INT,PERMISSION VARCHAR(MAX))
DECLARE @USERID INT,@PERMISSION VARCHAR(MAX),@PER INT
DECLARE C CURSOR FOR
SELECT USERID,PERMISSION FROM @TEST
OPEN C
FETCH NEXT FROM C INTO @USERID,@PERMISSION
WHILE @@FETCH_STATUS=0
BEGIN
WHILE( CHARINDEX('-',@PERMISSION))>1
BEGIN
SET @PER= (SUBSTRING(@PERMISSION,0,CHARINDEX('-',@PERMISSION)))
SET @PERMISSION=(SUBSTRING(@PERMISSION,CHARINDEX('-',@PERMISSION)+1,LEN(@PERMISSION)))
INSERT INTO @RESULT VALUES (@USERID,CONVERT(INT,@PER))
END
FETCH NEXT FROM C INTO @USERID,@PERMISSION
END
CLOSE C
DEALLOCATE C
SELECT * FROM @RESULT
The result is:
*------*----------------*
|USERID| PERMISSION |
*------*----------------*
|1 | 1 |
*------*----------------*
|1 | 2 |
*------*----------------*
|1 | 3 |
*------*----------------*
|1 | 4 |
*------*----------------*
|1 | 5 |
*------*----------------*
|1 | 6 |
*------*----------------*
|1 | 7 |
*------*----------------*
|1 | 8 |
*------*----------------*
|1 | 9 |
*------*----------------*
|1 | 10 |
*------*----------------*
|1 | 11 |
*------*----------------*
|2 | 1 |
*------*----------------*
|2 | 2 |
*------*----------------*
|2 | 4 |
*------*----------------*
|2 | 7 |
*------*----------------*
|2 | 8 |
*------*----------------*
Use STRING_SPLIT in sql like this :
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
It returns following result table:
value
---------
Lorem
ipsum
dolor
sit
amet.
Look at here for more information
in sql server 2008 you have to create a function like below (refrence) :
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
so excute it like this
select *from dbo.fnSplitString('Querying SQL Server','')