Sql 将四列插入一列
早上好 我有一个表Sql 将四列插入一列,sql,sql-server,stored-procedures,unpivot,Sql,Sql Server,Stored Procedures,Unpivot,早上好 我有一个表TestSeed,用于存储具有以下结构的多项选择测试: QNo QText QA1 QA2 QA3 QA4 QNo QA 它已经包含数据 我想将一些列移动到具有以下结构的临时表中: QNo QText QA1 QA2 QA3 QA4 QNo QA 其中,QNo将存储第一个表中的问题编号,QA将在四行数据上存储QA1、QA2、QA3和QA4 我正试图在SQL存储过程中实现这一点。最后归结到以下情况: 我想创建一个嵌套循环,在这里我可以遍历外部循环中
TestSeed
,用于存储具有以下结构的多项选择测试:
QNo QText QA1 QA2 QA3 QA4
QNo QA
它已经包含数据
我想将一些列移动到具有以下结构的临时表中:
QNo QText QA1 QA2 QA3 QA4
QNo QA
其中,QNo
将存储第一个表中的问题编号,QA
将在四行数据上存储QA1
、QA2
、QA3
和QA4
我正试图在SQL存储过程中实现这一点。最后归结到以下情况:
我想创建一个嵌套循环,在这里我可以遍历外部循环中的TestSeed
表行,然后遍历四个QA
字段并将它们插入内部循环
因此,我的代码将如下所示:
Declare @TempAnswers as table
(
[QNo] int,
[QAnswer] [nvarchar](50) NULL,
)
DECLARE @QNO int
DECLARE QROW CURSOR LOCAL FOR select QNo from @TempSeed
OPEN QROW
FETCH NEXT FROM QROW into @QNO
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @i INT
SET @i = 1
WHILE (@i <=4)
Begin
insert into @TempAnswers
(
[QNo],
[QAnswer]
)
select QNo, 'QA'+@i --This is the part I need
from @TempSeed
SET @i = @i +1
END
FETCH NEXT FROM QROW into @QNO
END
CLOSE IDs
DEALLOCATE IDs
将@TempAnswers声明为表
(
[QNo]int,
[QAnswer][nvarchar](50)空,
)
声明@QNO int
为@TempSeed中的select QNo声明QROW游标本地
开放式QROW
从QROW获取下一个到@QNO
而@@FETCH\u STATUS=0
开始
声明@i INT
设置@i=1
虽然(@i不需要循环,但您只需使用table操作符即可:
INSERT INTO temp
SELECT
QNO,
val
FROM Testseed AS t
UNPIVOT
(
val
FOR col IN([QA1], [QA2], [QA3], [QA4])
) AS u;
例如,如果您有以下示例数据:
| QNO | QTEXT | QA1 | QA2 | QA3 | QA4 |
|-----|-------|-----|-----|-----|-----|
| 1 | q1 | a | b | c | d |
| 2 | q2 | b | c | d | e |
| 3 | q3 | e | a | b | c |
| 4 | q4 | a | c | d | e |
| 5 | q5 | c | d | e | a |
前面的查询将用以下内容填充temp
表:
| QNO | QA |
|-----|----|
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | b |
| 2 | c |
| 2 | d |
| 2 | e |
| 3 | e |
| 3 | a |
| 3 | b |
| 3 | c |
| 4 | a |
| 4 | c |
| 4 | d |
| 4 | e |
| 5 | c |
| 5 | d |
| 5 | e |
| 5 | a |
UNPIVOT
表运算符将四列[QA1]、[QA2]、[QA3]、[QA4]
的值转换为行,仅转换为一行
然后,您可以将该查询放入存储过程中。因此,为了回答您的最后一个问题,您可以使用动态SQL,这涉及到将查询创建为字符串,然后执行它,以防您真的想坚持使用已启动的方法
您必须声明一个变量来存储查询文本:
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT QNo, QA' + @i + ' FROM @TempSeed'
EXEC sp_executesql @query
每次构建要执行的查询(声明、设置查询文本并执行查询)时都必须执行此操作
如果您想要更简单的,这里还有其他答案可以使用。试试以下方法:
Declare @TempAnswers as table
(
[QNo] int,
[QAnswer] [nvarchar](50) NULL,
);
INSERT INTO @TempAnswers(QNo, QAnswer)
SELECT QNo, QA
FROM (SELECT QNo, QA1 AS QA FROM TestSeed
UNION
SELECT QNo, QA2 AS QA FROM TestSeed
UNION
SELECT QNo, QA3 AS QA FROM TestSeed
UNION
SELECT QNo, QA4 AS QA FROM TestSeed
) AS A
ORDER BY QNo;
工作很有魅力。非常感谢。@YaserQ8-随时欢迎您,很高兴我能帮助您。欢迎来到Stackoverflow:)知道这一点非常有用。我很需要这个。非常感谢。