Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 将四列插入一列_Sql_Sql Server_Stored Procedures_Unpivot - Fatal编程技术网

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:)知道这一点非常有用。我很需要这个。非常感谢。