2014-10-30 192 views
0

輸入參數是 - 100, 'abc,def,ghi', '10,20,30'。他們已經被插入到表中作爲從多個表中插入多行 - SQL

menuid(int) cid(int) code(varchar) 
---------------------------------- 
100   10   abc 
100   20   def 
100   30   ghi 

我已經使用了函數從這裏分割字符串 - http://www.sqlservercentral.com/blogs/querying-microsoft-sql-server/2013/09/19/how-to-split-a-string-by-delimited-char-in-sql-server/

,這裏是我的代碼

declare @menuid int = 100 
declare @strcode varchar(max)='abc,def,ghi' 
declare @strid varchar(max)='10,20,30' 
declare @t1 table(
menuid int, 
cid int, 
code varchar(100) 
) 
;with t1 as(
select * from fnSplitString(@strid,',') 
) 
;with t2 as(
select * from fnSplitString(@strcode,',') 
) 
insert into @t1 

...不知道如何從這裏開始

回答

3

我剛剛修改了用於拆分的功能&繼續爲您解決問題...

ALTER FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(id int, splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @id INT,@start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) ,@id=1 

    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (id,splitdata) 
     VALUES(@id,SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @id = @id + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

下一步

declare @menuid int = 100 
declare @strcode varchar(max)='abc,def,ghi' 
declare @strid varchar(max)='10,20,30' 
declare @t1 table(
menuid int, 
cid int, 
code varchar(100) 
) 
insert into @t1 
select @menuid, 
    s1.splitdata AS cid,s2.splitdata AS code 
    from fnSplitString(@strid,',') s1 
    INNER JOIN 
    (
     select * from fnSplitString(@strcode,',') 
    )s2 on s1.id=s2.id 

select * from @t1 
+0

非常感謝。 – Qwerty 2014-10-30 09:37:54

1

您可以更新功能也返回一個數字爲每分裂字符串是這樣的:

ALTER FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX), currentIndex int 
) 
BEGIN 
    DECLARE @count int = 0 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata, currentIndex) 
     VALUES(SUBSTRING(@string, @start, @end - @start), @count) 
     SET @start = @end + 1 
     SET @count += 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

現在,您可以加入一個函數的結果簡單的查詢並將其插入到您的表中。

declare @menuid int = 100 
declare @strcode varchar(max)='abc,def,ghi' 
declare @strid varchar(max)='10,20,30' 

declare @t1 table(
menuid int, 
cid int, 
code varchar(100) 
); 


INSERT INTO @t1 
SELECT @menuid menuId, codes.splitdata cid, ids.splitdata code FROM fnSplitString(@strid,',') codes LEFT OUTER JOIN 
    fnSplitString(@strcode,',') ids ON codes.currentIndex = ids.currentIndex