Tsql split

IF OBJECT_ID('f_split') IS NOT NULL
BEGIN
    PRINT 'Dropping function'
    DROP FUNCTION f_split
    IF @@ERROR = 0
        PRINT 'Function dropped'
END
GO

 
CREATE FUNCTION f_split
(
	@c         VARCHAR(2000),
	@split     VARCHAR(2)
)
RETURNS @t TABLE(id INT IDENTITY, col VARCHAR(20))
AS
BEGIN
	SET @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), '')
	END
	INSERT @t  (  col  )
	VALUES (   LTRIM(RTRIM(@c))  )
	RETURN
END
GO

 
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值