Вопрос

I have a table named assignRole.

I am passing string of userid (int) csv ,and passing roleid(int).

I want a stored procedure which split userid from string and take roleid and insert these values in table.this thing is to happen for all values in userid string.

Это было полезно?

Решение

First, create a function:

CREATE FUNCTION [dbo].[SplitInts]
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN ( SELECT Item = CONVERT(INT, Item) FROM ( 
     SELECT Item = x.i.value('(./text())[1]', 'int') FROM ( 
       SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') 
       + '</i>').query('.') ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
     WHERE Item IS NOT NULL
   );

Now you can say:

INSERT dbo.assignRole(RoleID, UserID)
  SELECT @RoleID, Item
  FROM dbo.SplitInts(@UserIDList, ',');

Другие советы

I like to use a table-valued function to do the split.

IF OBJECT_ID (N'dbo.StrSplit') IS NOT NULL DROP FUNCTION dbo.[StrSplit] GO

CREATE FUNCTION [dbo].[StrSplit] ( @String VARCHAR(MAX), @Delimiter char(1) ) RETURNS @Results TABLE ( Items NVARCHAR(MAX) ) AS BEGIN DECLARE @INDEX INT DECLARE @SLICE nvarchar(MAX)

-- HAVE TO SET TO 1 SO IT DOESNT EQUAL ZERO FIRST TIME IN LOOP
SELECT @INDEX = 1


-- Early exit if passed string is null
IF @String IS NULL RETURN

WHILE @INDEX !=0
BEGIN 
          -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
          SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)

          -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
          IF @INDEX !=0
                 SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
          ELSE
                 SELECT @SLICE = @STRING
          -- PUT THE ITEM INTO THE RESULTS SET
          INSERT INTO @Results(Items) VALUES(@SLICE)
          -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
          SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
          -- BREAK OUT IF WE ARE DONE
          IF LEN(@STRING) = 0 BREAK
END
RETURN

END

GO GRANT SELECT ON [dbo].[StrSplit] TO [public]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top