Tsql split

来源:互联网 发布:风险指数矩阵举例 编辑:程序博客网 时间:2024/04/20 11:56
IF OBJECT_ID('f_split') IS NOT NULLBEGIN    PRINT 'Dropping function'    DROP FUNCTION f_split    IF @@ERROR = 0        PRINT 'Function dropped'ENDGO CREATE FUNCTION f_split(@c         VARCHAR(2000),@split     VARCHAR(2))RETURNS @t TABLE(id INT IDENTITY, col VARCHAR(20))ASBEGINSET @c = REPLACE(@c, CHAR(10), '')SET @c = REPLACE(@c, '', '')SET @c = REPLACE(@c, CHAR(13), '')WHILE (CHARINDEX(@split, @c) <> 0)BEGIN    INSERT @t  (  col  )    VALUES (   SUBSTRING(@c, 1, CHARINDEX(@split, @c) -1)  )    SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')ENDINSERT @t  (  col  )VALUES (   LTRIM(RTRIM(@c))  )RETURNENDGO DECLARE @string NVARCHAR(MAX) =         N'Custaccount,salesID,invoiceID,FROMWHOUSE,TOWHOUSE,createddate,ETADATE,SHIPIMMEDCODE,ordertype,avorderstatus,AVAPACCOUNT  ';WITH cte AS (         SELECT tname,               cname,               MAX(TYPE)   AS [type],               MAX([len])  AS [len],               MAX([per])  AS [per] FROM   (                SELECT * FROM   ax                 UNION SELECT * FROM   drmpos            )              ax         GROUP BY      tname,      cname     )     ,coltype AS (         SELECT DISTINCT tname, cname,               CASE ty.system_type_id WHEN 108 THEN ty.name + '(' + CAST(cte.[len] AS NVARCHAR(5))                 + '),' WHEN 231 THEN ty.name +                 '(' + CAST(cte.[len] AS NVARCHAR(5)) + '),' END AS typ FROM               sys.types ty                INNER JOIN cte                     ON  ty.system_type_id = cte.[type]         WHERE  ty.name <> 'sysname'     ) ,res AS ( SELECT id,col,      cname,      ISNULL(typ, 'nvarchar(50),') AS c ,  tname FROM   dbo.f_split(@string, ',') AS t       LEFT JOIN coltype            ON  t.col = cname ) SELECT id ,col,MAX(c)AS c from res GROUP BY id,col ORDER BY id 

0 0
原创粉丝点击