Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 将SQL字符串转换为多列_Sql Server 2008_Split_Sql Function - Fatal编程技术网

Sql server 2008 将SQL字符串转换为多列

Sql server 2008 将SQL字符串转换为多列,sql-server-2008,split,sql-function,Sql Server 2008,Split,Sql Function,我有一个输入变量 @inputData varchar(Max) e、 g: Victor:2;John:22;Jo:100 如何将变量拆分为两列 Col1 Col2 ---------- Victor 2 John 22 Jo 100 可能不是一个非常好/有效的解决方案,通常基于您的示例;您可以尝试以下方法: create table tab1(col varchar(100)) insert into tab1 values ('key1:val1;ke

我有一个输入变量

@inputData varchar(Max)
e、 g:

Victor:2;John:22;Jo:100
如何将变量拆分为两列

Col1    Col2
----------
Victor   2
John     22
Jo       100

可能不是一个非常好/有效的解决方案,通常基于您的示例;您可以尝试以下方法:

create table tab1(col varchar(100))

insert into tab1 values ('key1:val1;key2:val2;key3:valu3')
查询:

select SUBSTRING((SUBSTRING((left(col,CHARINDEX(';',Col))),0,
charindex(';',col))),0,charindex(':',col)) as Name,

SUBSTRING((SUBSTRING((left(col,CHARINDEX(';',Col))),0,
charindex(';',col))),(charindex(':',col)+1),4) as Age
from tab1 

union

select SUBSTRING((SUBSTRING(right(col,CHARINDEX(';',Col)),0,
charindex(';',col))) ,0,charindex(':',col)) as Name,

SUBSTRING((SUBSTRING(right(col,CHARINDEX(';',Col)),0,
charindex(';',col))),(charindex(':',col)+1),4) as Age
from tab1 

union

select SUBSTRING((SUBSTRING(substring(col,(CHARINDEX(';',Col) + 
1),10),0,charindex(';',col))),0,charindex(':',col)) as Name,

SUBSTRING((SUBSTRING(substring(col,(CHARINDEX(';',Col) + 1),10),0,
charindex(';',col))),(charindex(':',col)+1),4) as Age
from tab1
实现这一点的最佳方法是UDF(用户定义函数)。这只是一个简单的例子
下面是脚本,它从单个字符串值中提供了多个列和行

declare @inputData varchar(Max) = 'Victor:2;John:22;Jo:100' +  ';'

;with row(c1,c2)
as
(
SELECT  LEFT
        ( @inputData
         , CHARINDEX(';', @inputData, 0) - 1
        ) col1

        , SUBSTRING 
        ( @inputData
         , CHARINDEX(';', @inputData, 0) + 1
         , LEN(@inputData)  
        ) col2

UNION ALL

SELECT  LEFT
        ( c2
         , CHARINDEX(';', c2, 0) - 1
        ) col1

        , SUBSTRING 
        ( c2
         , CHARINDEX(';', c2, 0) + 1
         , LEN(c2)  
        ) col2 
FROM row 
WHERE CHARINDEX(';', c2, 0) >0
) 

select LEFT(C1, CHARINDEX(':', c1, 0) - 1) col1,  SUBSTRING( c1 , CHARINDEX(':', c1, 0) + 1, LEN(c1)) col2 from row
输出:

col1    col2
Victor  2
John    22
Jo  100

是的,我们将把它实现为UDF,并在SP中使用它。如果两个列值的长度相同,那么Thanksit是有效的。我有一个条件,列值不具有相同的长度。我已经根据我的问题进行了编辑。