将四列插入一列

时间:2013-12-25 07:25:24

标签: sql sql-server stored-procedures unpivot

早上好,

我有一个表TestSeed,它存储具有以下结构的多项选择测试:

QNo  QText  QA1  QA2  QA3  QA4

它已包含数据。

我想将一些列移动到具有以下结构的临时表:

QNo  QA

QNo将存储第一个表格中的问题编号,而QA会存储QA1QA2QA3QA4四行数据。

我正在尝试在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

所以我想我的问题是:我可以使用连接字符串来引用SQL中的列名吗?如果是这样的话?

我是一个初学者。我将不胜感激任何帮助。

3 个答案:

答案 0 :(得分:2)

无需循环,您只需使用UNPIVOT表运算符即可:

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]的值转换为行,只有一行。

然后您可以将该查询放在存储过程中。

答案 1 :(得分:0)

因此,要回答您的上一个问题,您可以使用动态SQL,其中包括将您的查询创建为STRING然后执行它,以防您真正想要坚持已经开始的方法。

您必须声明一个变量来存储查询文本:

DECLARE @query NVARCHAR(MAX)

SET @query = 'SELECT QNo, QA' + @i + ' FROM @TempSeed'

EXEC sp_executesql @query

每次构建要执行的查询时都必须这样做(声明,设置查询文本并执行它)。

如果你想要更简单的东西,这里还有其他答案可以解决。

答案 2 :(得分:0)

试试这个:

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;