【发布时间】:2020-03-30 03:12:01
【问题描述】:
我希望遍历两个逗号分隔的值并执行插入
作为一个例子,让我们考虑两个变量
Declare @Qid= 1,4,6,7,8 @Answers = 4,4,3,2,3
set @pos = 0
set @len = 0
WHILE CHARINDEX(',', @Answers, @pos+1)>0
BEGIN
set @len = CHARINDEX(',', @Answers, @pos+1) - @pos
set @value = SUBSTRING(@Answers, @pos, @len)
insert into table values(@fdid,@Qid,@fusid, @value) -- i need Qid also
set @pos = CHARINDEX(',', @Answers, @pos+@len) +1
END
使用这个循环我可以提取@Answers 并可以执行插入。但我希望提取@Qid 并插入到循环中。
编辑 为了更清楚,它是一个反馈模块。我的结果表有 Qid 和 Answer 字段。答案是等级(1 到 5)。我们在变量@Qid 和@Answers 中得到的值是连续的。这意味着第一个答案将是第一个问题,依此类推。
编辑
根据 Shnugo 的回答
Declare @Qid varchar(100)= '1,4,6,7,8', @Answers varchar(100)= '4,4,3,2,3'
DECLARE @tbl TABLE(ID INT IDENTITY, Questions VARCHAR(100),Answers VARCHAR(100));
INSERT INTO @tbl VALUES(@Qid,@Answers)
INSERT INTO table(FeedbackId,QuestionId,FeedbackUserId,Answer)
SELECT 1,
A.qXml.value('(/x[sql:column("B.QuestionCount")])[1]','int') AS QuestionNumber,3
,A.aXml.value('(/x[sql:column("B.QuestionCount")])[1]','int') AS AnwerNumber
FROM @tbl t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(@Qid,',','</x><x>') + '</x>' AS XML)
,CAST('<x>' + REPLACE(@Answers,',','</x><x>') + '</x>' AS XML)) A(qXml,aXml)
CROSS APPLY(SELECT TOP(A.qXml.value('count(/x)','int')) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values) B(QuestionCount)
【问题讨论】:
-
您的 SQL Server 版本是多少?
-
或者使用
string_split,所有支持的sql-server版本 -
这些是您要插入的对吗:
(1, 4), (4, 4), (6, 3), (7, 3), (8, 3)? -
我们如何确定问题的答案?
-
@Serg,开发人员忘记将片段位置包含在结果集中。文档明确指出,该集合可能不会按预期顺序返回...
标签: sql sql-server tsql sql-server-2014