早上好,
我有一个表TestSeed
,它存储具有以下结构的多项选择测试:
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
所以我想我的问题是:我可以使用连接字符串来引用SQL中的列名吗?如果是这样的话?
我是一个初学者。我将不胜感激任何帮助。
答案 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;