【问题标题】:insert SQL rows from a string with comma record-delimiter and colon-delimited name-value pairs从带有逗号记录分隔符和冒号分隔的名称-值对的字符串中插入 SQL 行
【发布时间】:2013-04-19 11:44:35
【问题描述】:

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

'1:0,2:1,3:1,4:0'

值用逗号分隔:冒号前的值为studentId,冒号后为位值。

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

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

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

【问题讨论】:

  • 哪个版本的sql server?
  • 你尝试过什么...?

标签: sql database sql-server-2005


【解决方案1】:

这适用于 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

【讨论】:

  • 你能告诉我 sql server 2005 中的解决方案吗,因为它在 2005 年不起作用
  • 我们可以用@t table 代替#table 吗?
  • 我认为表变量在其初始范围之外将不可用。
  • 此解决方案易受 SQL 注入攻击。值得关注responsible ways to use dynamic sql
【解决方案2】:

试试这个

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

编辑

假设您的学生表有列 StudentId、Name。查找更新后的查询加入学生表

SELECT ST.Name,SP.studentID,SP.BitValue FROM 
(
  SELECT   
 xmlcol.value('/table[1]/col[1]','varchar(100)') AS studentID,    
 xmlcol.value('/table[1]/col[2]','varchar(100)') AS BitValue
 FROM Split_Col
) SP
INNER JOIN Student ST on SP.studentID = ST.studentID

【讨论】:

  • @Muhammad Jawad 很高兴我的回答对您有所帮助
  • 请告诉我如何将这个 CTE 加入我们的主查询,因为在这个 CTE 中列名让我感到困惑。我们必须将此 CTE 与具有学生 ID 和位值的学生表一起加入,谢谢
  • 并且还告诉我从加入这个 CTE 的主查询中调用谁来调用这些列?
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
相关资源
最近更新 更多