Sql 使用光标将数据垂直插入临时表

Sql 使用光标将数据垂直插入临时表,sql,stored-procedures,cursor,temp-tables,Sql,Stored Procedures,Cursor,Temp Tables,如上所述。我在SQL中创建了两个临时表,需要垂直插入才能完成所有列,但据我所知,您只能水平插入数据 有办法解决这个问题吗 例如: ForgeinKey | Q1 | Q2 | Q3 | Q4 | Q5 | 1234 | 1 | 1| 0 | 2 | 0| 1235 | 0 | 2| 1 | 2 | 0| 1236 | 2 | 2| 0 |

如上所述。我在SQL中创建了两个临时表,需要垂直插入才能完成所有列,但据我所知,您只能水平插入数据

有办法解决这个问题吗

例如:

ForgeinKey  |  Q1  |  Q2  |  Q3  |  Q4  |  Q5  | 
   1234     |    1 |     1|    0 |    2 |     0|
   1235     |    0 |     2|    1 |    2 |     0|
   1236     |    2 |     2|    0 |    0 |     1|
我认为会发生这样的事情:

ForgeinKey  |  Q1  |  Q2  |  Q3  |  Q4  |  Q5 |
   1234     | 1    |NULL  | NULL |  NULL| NULL|
   1234     |NULL  | 1    | NULL |  NULL| NULL|
   1234     |NULL  |NULL  |  0   |  NULL| NULL|
   1234     |NULL  |NULL  | NULL |    2 | NULL|
   1234     |NULL  |NULL  | NULL |  NULL|   0 |      (etc)
目前,我的临时表(2)的前几个列中有所有数据,但之后我有22个列,我应该用另一个临时表(1)中的数据填充这些列

在临时表(1)中,我将所有数据水平显示:

Answers  |  Questions  |  ForeignKey
   1     |      Q1     |       1234     
   1     |      Q2     |       1234  
   0     |      Q3     |       1234  
   2     |      Q4     |       1234  
   0     |      Q5     |       1234  
如上所示,我需要临时表(1)使用外键垂直填充临时表(2)以标识行:

ForgeinKey  |  Q1  |  Q2  |  Q3  |  Q4  |  Q5|
   1234     |    1 |     1|    0 |     2|   0|
   1235     |    0 |     2|    1 |     2|   0|
   1236     |    2 |     2|    0 |     0|   1|
这是我目前在BlueFoots解决方案中使用的代码:

BEGIN
SET DATEFORMAT ymd;


--Temp Table 1 (Answers)
DECLARE @AnswersTempTable TABLE
(
    tblManagerSpotCheckAnswer_ID    bigint, 
    lManagerSpotCheck_ID            bigint, 
    lManagersSpotCheckQuestion_ID   bigint, 
    lManagersSpotCheckAnswer        int, 
    sDescription                    varchar(100)
)

INSERT INTO @AnswersTempTable
SELECT     tblManagerSpotCheckAnswers.tblManagerSpotCheckAnswer_ID,           tblManagerSpotCheckAnswers.lManagerSpotCheck_ID, 
                  tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID,   tblManagerSpotCheckAnswers.lManagersSpotCheckAnswer, 
                  tblManagerSpotCheckQuestions.sDescription
FROM         tblManagerSpotCheckAnswers INNER JOIN
                      tblManagerSpotChecks ON   tblManagerSpotCheckAnswers.lManagerSpotCheck_ID = tblManagerSpotChecks.lManagerSpotCheck_ID     INNER JOIN
                      tblManagerSpotCheckQuestions ON 
                      tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID = tblManagerSpotCheckQuestions.lManagersSpotCheckQuestion_ID LEFT OUTER JOIN
                      tblCallDiary ON tblManagerSpotChecks.lCallDiary_ID = tblCallDiary.lCallDiary_ID
WHERE     (tblCallDiary.lCycle_ID = @lCycle_ID) AND (tblManagerSpotChecks.lRMStaff_ID = @Staff_ID)
ORDER BY tblManagerSpotChecks.lManagerSpotCheck_ID

--SELECT * FROM @AnswersTempTable
--临时表2(结果)

结束


这样做时,我仍然会出错

您的问题并不完全清楚,但您可以应用
UNPIVOT
函数将数据从列转换为行,或应用
PIVOT
函数将行转换为列

一旦数据达到您需要的格式,您可以根据需要插入数据

枢轴:

select ForeignKey, Q1, Q2, Q3, Q4, Q5
from
(
  select ForeignKey, questions, answers
  from table1
) src
pivot
(
  max(answers)
  for questions in (Q1, Q2, Q3, Q4, Q5)
) piv;
select ForgeinKey, questions, answers
from table2
unpivot
(
  answers
  for questions in (Q1, Q2, Q3, Q4, Q5)
) unpiv
UNPIVOT:

select ForeignKey, Q1, Q2, Q3, Q4, Q5
from
(
  select ForeignKey, questions, answers
  from table1
) src
pivot
(
  max(answers)
  for questions in (Q1, Q2, Q3, Q4, Q5)
) piv;
select ForgeinKey, questions, answers
from table2
unpivot
(
  answers
  for questions in (Q1, Q2, Q3, Q4, Q5)
) unpiv

请参见这两个版本的说明

什么是垂直插入?你能发布之前和之后的数据示例吗?你好,我现在就更新。更新。希望你明白我的意思。嗨,蓝脚怪,谢谢你的回复。我试过了,但还是有错误。“将数据类型nvarchar转换为bigint时出错”,其中很多。我已经用我用来帮助澄清我想做什么的代码更新了我原来的帖子。希望这有帮助?@user2145342您能用您的表结构和一些示例数据编辑吗?我已经试过了,但没有正确的方法。我可以将表1和表2中的值通过邮件发送给您吗?--从AnswersTempTable中选择*,从ResultTempTable中选择*?