Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何分离字符串值并创建temp以在temp表中存储单独的字符串_Sql Server - Fatal编程技术网

Sql server 如何分离字符串值并创建temp以在temp表中存储单独的字符串

Sql server 如何分离字符串值并创建temp以在temp表中存储单独的字符串,sql-server,Sql Server,我正在使用SQLServer2005 我已经创建了一个包含ID和Courses列的表。记录如下: IDL课程 1.Java、ASP.Net、C# 2.Java 3.Java,C# 4.html Courses列的类型为varchar,其中的值以逗号分隔。 我想把每个单词分开,然后存储在另一个或临时文件中。桌子 输出必须如下所示: IDL课程 1.Java 2.ASP.Net 3.C# 4.html 这里ID不重要 谢谢。见 这是最好的来源: 创建一个拆分函数,并按如下方式使用: SELECT

我正在使用SQLServer2005

我已经创建了一个包含
ID
Courses
列的表。记录如下:

IDL课程
1.Java、ASP.Net、C#
2.Java
3.Java,C#
4.html

Courses
列的类型为varchar,其中的值以逗号分隔。 我想把每个单词分开,然后存储在另一个或临时文件中。桌子

输出必须如下所示:

IDL课程
1.Java
2.ASP.Net
3.C#
4.html

这里ID不重要

谢谢。

这是最好的来源:

创建一个拆分函数,并按如下方式使用:

SELECT
    *
    FROM YourTable  y
    INNER JOIN dbo.splitFunction(@Parameter) s ON y.ID=s.Value

要使此方法起作用,您需要执行以下一次性时间表设置:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
设置数字表后,创建此函数:

CREATE FUNCTION [dbo].[FN_ListToTable]
(
     @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
    ,@List     varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN 
(

    ----------------
    --SINGLE QUERY-- --this will not return empty rows
    ----------------
    SELECT
        ListValue
        FROM (SELECT
                  LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT @SplitOn + @List + @SplitOn AS List2
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = @SplitOn
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''

);
GO 
输出:

ListValue
-----------------------
1
2
3
4
5
6777

(6 row(s) affected)
RowID       RowValue
----------- --------------
1           ASP.Net
2           C#
3           html
4           Java

(4 row(s) affected)
要使所需工作正常,请使用交叉应用:

DECLARE @tbl_A table (RowID int, RowValue varchar(500))
DECLARE @tbl_b table (RowID int identity, RowValue varchar(500))

INSERT INTO @tbl_A VALUES (1, 'Java, ASP.Net, C#')
INSERT INTO @tbl_A VALUES (2, 'Java')
INSERT INTO @tbl_A VALUES (3, 'Java, C#')
INSERT INTO @tbl_A VALUES (4, 'html')

INSERT INTO @tbl_b (RowValue)
SELECT DISTINCT
    st.ListValue
    FROM @tbl_A 
        CROSS APPLY  dbo.FN_ListToTable(',',RowValue) AS st
    ORDER BY st.ListValue

SELECT * FROM @tbl_b ORDER BY RowID
输出:

ListValue
-----------------------
1
2
3
4
5
6777

(6 row(s) affected)
RowID       RowValue
----------- --------------
1           ASP.Net
2           C#
3           html
4           Java

(4 row(s) affected)

非常感谢你。你给了我一个完美的解决方案。