Попробуйте один
--Build Schema for Your Case
DECLARE @TAB TABLE (ID INT, NAME VARCHAR(1000))
INSERT INTO @TAB
SELECT 1,'Pravesh,Simon'
UNION ALL
SELECT 2,'Me,Myself,I'
--Used Recursive CTE to achieve Tabular view of Comma Separated Column
--Used While loop to take next row
--Used Table Variable @RESULT to store your Result Set
DECLARE @ID INT, @T VARCHAR(100), @SNO INT= 1, @MAX_SNO INT
DECLARE @RESULT TABLE (ID INT, NAME VARCHAR(1000))
SELECT @SNO=1, @MAX_SNO =MAX(ID) FROM @TAB
WHILE(@SNO<[email protected]_SNO)
BEGIN
SELECT @ID = ID, @T = NAME FROM @TAB WHERE [email protected]
SET @T [email protected]+','
;WITH MyCTE(Start,[End]) AS(
SELECT 1 AS Start,CHARINDEX(',',@T,1) AS [End]
UNION ALL
SELECT [End]+1 AS Start,CHARINDEX(',',@T,[End]+1)AS [End]
from MyCTE where [End]<LEN(@T)
)
INSERT INTO @RESULT
Select @SNO AS ID, SUBSTRING(@T,Start,[End]-Start) NAME from MyCTE;
SET @SNO+=1
END
--Getting Result Set
SELECT * FROM @RESULT
Edit: Из ваших Комментарии
Если вы хотите сделать выше с функцией, этот намного легче, чем выше зацикливание.
CREATE FUNCTION [DBO].[FN_SPLIT_STR_TO_COL] (@T AS VARCHAR(4000))
RETURNS
@RESULT TABLE(VALUE VARCHAR(250))
AS
BEGIN
SET @T= @T+','
;WITH MYCTE(START,[END]) AS(
SELECT 1 AS START,CHARINDEX(',',@T,1) AS [END]
UNION ALL
SELECT [END]+1 AS START,CHARINDEX(',',@T,[END]+1)AS [END]
FROM MYCTE WHERE [END]<LEN(@T)
)
INSERT INTO @RESULT
SELECT SUBSTRING(@T,START,[END]-START) NAME FROM MYCTE;
RETURN
END
Теперь просто вызовите функцию для каждой строки, передав ей столбец.
С Cross Apply
SELECT ID,FN_RS.VALUE FROM @TAB
CROSS APPLY
(SELECT * FROM [DBO].[FN_SPLIT_STR_TO_COL] (NAME)) AS FN_RS
http://stackoverflow.com/questions/2696884/split-value-from-one-field-to-two –
может у проверить мой ответ ... @ pravesh.kan – Chanukya
после размещения вопросов u должен проверить ответы, и он удовлетворяет вашему требованию, и вы должны принять .. @ pravesh.kan – Chanukya