fn_SplitStringToTable

-- Set the database where the stored procedure is located
USE SecurityData
GO

-- Drop older version if it exists
IF OBJECTPROPERTY(OBJECT_ID(N'dbo.fn_SplitStringToTable'), N'IsTableFunction') = 1
   DROP FUNCTION dbo.fn_SplitStringToTable
GO
-- Procedure:     dbo.fn_SplitStringToTable
-- Purpose:      
-- Location:      SecurityData
-- Authorized To: N/A
-- Last Update:   07/31/2005
-- Parameters:
--    Input
--       1. p_Input             VARCHAR(MAX)      -
--       2. p_Delimeter         CHAR(1)           -
--    Output
--       None
-- Result Set:
--    None
--
-- Return: @@ERROR
-- Exception return values:
--
-- Author:      Michael .H
-- Create Date: 07/31/2005
-- Customization Level: Low
-- Revisions:
--
CREATE FUNCTION dbo.fn_SplitStringToTable
(
   @p_Input     VARCHAR(MAX),
   @p_Delimeter CHAR(1) = ','
)
RETURNS @l_Table TABLE
(
   Id       INT IDENTITY(1, 1),
   Value    VARCHAR(511),
   Position INT,
   Length   INT
)
WITH ENCRYPTION
BEGIN
   DECLARE @l_Position INT,
           @l_Value    VARCHAR(256)
  
   SELECT @l_Position = 1,
          @l_Value = ''
  
   IF RIGHT(@p_Input, LEN(@p_Delimeter)) <> @p_Delimeter
      SET @p_Input = @p_Input + @p_Delimeter
  
   WHILE SUBSTRING(@p_Input, @l_Position, 1) = CHAR(10) OR
         SUBSTRING(@p_Input, @l_Position, 1) = CHAR(13)
   BEGIN
      SELECT @l_Position = @l_Position + 1
   END
  
   WHILE @l_Position <= CHARINDEX(@p_Delimeter, @p_Input, @l_Position)
   BEGIN
      SET @l_Value = RTRIM ( LTRIM ( SUBSTRING ( @p_Input,
                                                 @l_Position,
                                                 CHARINDEX ( @p_Delimeter,
                                                             @p_Input,
                                                             @l_Position) - @l_Position ) ) )
     
      IF NOT EXISTS ( SELECT 1
                        FROM @l_Table
                       WHERE Value = @l_Value )
      BEGIN
         INSERT INTO @l_Table ( Value, Position, Length )
              VALUES ( @l_Value, @l_Position, CHARINDEX ( @p_Delimeter,
                                                          @p_Input,
                                                          @l_Position ) - @l_Position )
      END
     
      SELECT @l_Position = CHARINDEX(@p_Delimeter, @p_Input, @l_Position) + 1
     
      WHILE SUBSTRING(@p_Input, @l_Position, 1) = CHAR(10) OR
         SUBSTRING(@p_Input, @l_Position, 1) = CHAR(13)
      BEGIN
         SELECT @l_Position = @l_Position + 1
      END
   END
   RETURN
END
GO

GRANT SELECT ON dbo.fn_SplitStringToTable TO rl_DataDownload
GRANT SELECT ON dbo.fn_SplitStringToTable TO rl_DataUpload

GO

posted @ 2012-08-29 14:32  Alex Tian  阅读(806)  评论(0编辑  收藏  举报