set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[Random]
AS
BEGIN
CREATE TABLE TC(ID INT IDENTITY(1,1),question VARCHAR(10), choiceA VARCHAR(10), choiceB VARCHAR(10), choiceC  VARCHAR(10), choiceD VARCHAR(10), answer VARCHAR(1))
SELECT * INTO # FROM (
SELECT ID,question,choiceA FROM clozetest UNION ALL
SELECT ID,question,choiceB FROM clozetest UNION ALL
SELECT ID,question,choiceC FROM clozetest UNION ALL
SELECT ID,question,choiceD FROM clozetest
) A 
ORDER BY ID,NEWID()SELECT *,SEQ=IDENTITY(INT,1,1) INTO #T  FROM #TRUNCATE TABLE TC
INSERT TC(question,choiceA,choiceB,choiceC,choiceD,answer)
SELECT TC.question,choiceA,choiceB,choiceC,choiceD,
           CASE WHEN choiceA=choice THEN 'A' WHEN choiceB=choice THEN 'B' WHEN choiceC=choice THEN 'C' WHEN choiceD=choice THEN 'D'  END AS answer
FROM (SELECT ID,question,
    MAX(CASE WHEN SEQ=1 THEN choiceA END) AS choiceA,
    MAX(CASE WHEN SEQ=2 THEN choiceA END) AS choiceB,
    MAX(CASE WHEN SEQ=3 THEN choiceA END) AS choiceC,
    MAX(CASE WHEN SEQ=4 THEN choiceA END) AS choiceD
FROM (SELECT ID,question,choiceA,SEQ-(SELECT COUNT(*) FROM #T WHERE ID<A.ID) AS SEQ FROM #T  AS A) T
GROUP BY ID,question) AS TC 
JOIN
(SELECT ID,CASE ANSWER WHEN 'A' THEN choiceA WHEN 'B' THEN choiceB WHEN 'C' THEN choiceC WHEN 'D' THEN choiceD END AS choice
 FROM clozetest) AS clozetest
ON TC.ID=clozetest.ID
ORDER BY NEWID()SELECT * FROM TC--DROP TABLE TB
DROP TABLE TC
DROP TABLE #
DROP TABLE #TEND

解决方案 »

  1.   

    出错信息如下:(1036 行受影响)(1036 行受影响)
    消息 8152,级别 16,状态 2,过程 Random,第 25 行
    将截断字符串或二进制数据。
    语句已终止。
    警告: 聚合或其他 SET 操作消除了空值。(0 行受影响)
      

  2.   

    第25行我查了,是:
    SELECT *,SEQ=IDENTITY(INT,1,1) INTO #T  FROM #
      

  3.   

    先不看你的代码行,从错误来看两个问题:
    1:字段定义太短,插入数据太长
    2:聚合函数里有NULL值