从具有逗号记录分隔符和冒号分隔的名称-值对的字符串中插入SQL行

从具有逗号记录分隔符和冒号分隔的名称-值对的字符串中插入SQL行,sql,database,sql-server-2005,Sql,Database,Sql Server 2005,我们收到的数据格式如下: '1:0,2:1,3:1,4:0' 这些值用逗号分隔:冒号前的值是studentId,冒号后的值是位值 我想将这些值存储在临时表中: studentID | BitValue 1 | 0 2 | 1 3 | 1 4 | 0 如何在SQL Server 2005中执行此操作?这在MS SQL Server 2008中有效 IF OBJECT_ID('temp

我们收到的数据格式如下:

'1:0,2:1,3:1,4:0'
这些值用逗号分隔:冒号前的值是studentId,冒号后的值是位值

我想将这些值存储在临时表中:

studentID   |   BitValue
1           |    0
2           |    1
3           |    1
4           |    0

如何在SQL Server 2005中执行此操作?

这在MS SQL Server 2008中有效

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
drop table #TempTable

create table #TempTable (studentID int, BitValue int)
declare @var nvarchar(max)
set @var='1:0,2:1,3:1,4:0'

set @var='insert into #TempTable values ('+REPLACE(REPLACE(@var,',','),('), ':', ',')+')'
exec (@var)

select * from #TempTable

drop table #TempTable
对于MS SQL Server 2005,请尝试:

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
drop table #TempTable

create table #TempTable (studentID int, BitValue int)
declare @var nvarchar(max)
set @var='1:0,2:1,3:1,4:0'

--set @var=REPLACE(@var,',','),(')
set @var='insert into #TempTable values ('+REPLACE(REPLACE(@var,',','); insert into #TempTable values('), ':', ',')+')'
exec (@var)

select * from #TempTable

drop table #TempTable

这适用于MS SQL Server 2008

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
drop table #TempTable

create table #TempTable (studentID int, BitValue int)
declare @var nvarchar(max)
set @var='1:0,2:1,3:1,4:0'

set @var='insert into #TempTable values ('+REPLACE(REPLACE(@var,',','),('), ':', ',')+')'
exec (@var)

select * from #TempTable

drop table #TempTable
对于MS SQL Server 2005,请尝试:

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
drop table #TempTable

create table #TempTable (studentID int, BitValue int)
declare @var nvarchar(max)
set @var='1:0,2:1,3:1,4:0'

--set @var=REPLACE(@var,',','),(')
set @var='insert into #TempTable values ('+REPLACE(REPLACE(@var,',','); insert into #TempTable values('), ':', ',')+')'
exec (@var)

select * from #TempTable

drop table #TempTable
试试这个

DECLARE @param NVARCHAR(MAX)

SET @param = '1:0,2:1,3:1,4:0'

;WITH Split_Col 
AS
(
    SELECT CONVERT(XML,'<table><col>' + REPLACE(ColName,':', '</col><col>') + '</col></table>') AS xmlcol
    FROM
    (
        SELECT Split.a.value('.', 'VARCHAR(100)') AS ColName  
        FROM  
        (
             SELECT CAST ('<M>' + REPLACE(ColName, ',', '</M><M>') + '</M>' AS XML) AS ColName  
             FROM  (SELECT @param AS ColName) TableName
         ) AS A CROSS APPLY ColName.nodes ('/M') AS Split(a)
    ) TableName
)

 SELECT      
 xmlcol.value('/table[1]/col[1]','varchar(100)') AS studentID,    
 xmlcol.value('/table[1]/col[2]','varchar(100)') AS BitValue
 FROM Split_Col
试试这个

DECLARE @param NVARCHAR(MAX)

SET @param = '1:0,2:1,3:1,4:0'

;WITH Split_Col 
AS
(
    SELECT CONVERT(XML,'<table><col>' + REPLACE(ColName,':', '</col><col>') + '</col></table>') AS xmlcol
    FROM
    (
        SELECT Split.a.value('.', 'VARCHAR(100)') AS ColName  
        FROM  
        (
             SELECT CAST ('<M>' + REPLACE(ColName, ',', '</M><M>') + '</M>' AS XML) AS ColName  
             FROM  (SELECT @param AS ColName) TableName
         ) AS A CROSS APPLY ColName.nodes ('/M') AS Split(a)
    ) TableName
)

 SELECT      
 xmlcol.value('/table[1]/col[1]','varchar(100)') AS studentID,    
 xmlcol.value('/table[1]/col[2]','varchar(100)') AS BitValue
 FROM Split_Col


哪个版本的sql server?您尝试过什么…?哪个版本的sql server?您尝试过什么…?您能告诉我sql server 2005中的解决方案吗,因为它在2005年不起作用,我们可以用@t table而不是#table吗?我认为table变量在其初始范围之外将不可用。此解决方案易受SQL注入的影响。这是值得研究的。你能告诉我sql server 2005中的解决方案吗?因为它在2005年不起作用。我们可以用@t table而不是#table吗?我认为table变量在其初始范围之外将不可用。此解决方案易受sql注入的影响。这是值得研究的。@Muhammad Jawad我很高兴我的回答对您有所帮助。请告诉我如何将这个CTE与我们的主查询连接起来,因为这个CTE中的列名让我感到困惑。我们必须将这个CTE与包含学生id和位值的学生表连接起来,谢谢。还要告诉我,从加入这个CTE的主查询中,谁来调用这些列?@Muhammad Jawad我很高兴我的回答帮助了你。请告诉我如何将这个CTE与主查询连接起来,因为这个CTE中的列名让我感到困惑。我们必须用学生id和位值的学生表连接这个CTE,并且告诉我从连接这个CTE的主查询中调用这些coulumn的人是谁?