微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当列名不固定时,仅从 exec (SQL) 插入几列

如何解决当列名不固定时,仅从 exec (SQL) 插入几列

我有以下代码

IF OBJECT_ID(N'tempdb..#VALS') IS NOT NULL
BEGIN
DROP TABLE #VALS
END
IF OBJECT_ID(N'tempdb..#Tbl_Eval_Temp') IS NOT NULL
BEGIN
DROP TABLE #Tbl_Eval_Temp
END
IF exists (select top 1 * from Tbl_Eval)
BEGIN
DROP TABLE Tbl_Eval
END
create table Tbl_Eval (EmpID INT,CourseID NVARCHAR(100),Questions NVARCHAR(MAX),Answers NVARCHAR(MAX))
Insert into Tbl_Eval Values 
(1000,100,1,'2'),(1000,2,'4'),3,'1'),4,'3'),5,'5'),(1021,150,'Good'),'Very Good'),'Average'),'Poor'),'Very Poor'),6,7,8,9,10,'Very Poor')

DECLARE @sql NVARCHAR(MAX)
DECLARE @VALS NVARCHAR(500)
SELECT disTINCT [Questions] AS VALS INTO #VALS FROM Tbl_Eval
SELECT @VALS = COALESCE(@VALS+',','') + '[' + VALS + ']' FROM #VALS
create table #Tbl_Eval_Temp (EmpID INT,Q1 NVARCHAR(100),Q2 NVARCHAR(100),Q3 NVARCHAR(100),Q4 NVARCHAR(100),Q5 NVARCHAR(100),Q6 NVARCHAR(100),Q7 NVARCHAR(100),Q8 NVARCHAR(100),Q9 NVARCHAR(100),Q10 NVARCHAR(100)  )

SET @sql = 'SELECT EmpID,CourseID,'+@VALS+' FROM Tbl_Eval
           PIVOT(MIN([Answers]) FOR [Questions] IN ('+@VALS+')) PIV'
PRINT @sql
INSERT INTO #Tbl_Eval_Temp EXEC(@sql)
SELECT * FROM #Tbl_Eval_Temp

输出为:

The output is

我知道 EXEC(sql) 会给我 12 列,所以我创建了一个有 12 列的临时表 #Tbl_Eval_Temp。如果列数和列名也在运行时生成,该怎么办。可能只有 5 或 15 列。那么,我怎样才能达到如图所示的预期输出

解决方法

您可以像我为您编写的代码一样使用 exec sp_executesql :


DROP TABLE  IF EXISTS TBL_Eval
DROP TABLE IF EXISTS Tbl_Eval_Temp

create table Tbl_Eval (EmpID INT,CourseID NVARCHAR(100),Questions NVARCHAR(MAX),Answers NVARCHAR(MAX))
Insert into Tbl_Eval Values 
(1000,100,1,'2'),(1000,2,'4'),3,'1'),4,'3'),5,'5'),(1021,150,'Good'),'Very Good'),'Average'),'Poor'),'Very Poor'),6,7,8,9,10,11,'Very Good')

DECLARE @SQL NVARCHAR(MAX)
DECLARE @VALS NVARCHAR(500)
SELECT DISTINCT [Questions] AS VALS INTO #VALS FROM Tbl_Eval
SELECT @VALS = COALESCE(@VALS+',','') + '[' + VALS + ']' FROM #VALS
DECLARE @Counter AS INT
DECLARE @DistinctCount AS INT
DECLARE @CreateTableSql AS NVARCHAR(4000)
SET @Counter = 1
SET @DistinctCount = (SELECT MAX(CONVERT(INT,Vals)) FROM #VALS)
SET @CreateTableSql = 'create table Tbl_Eval_Temp (EmpID INT,CourseID NVARCHAR(100) '
WHILE(@Counter<=@DistinctCount)
BEGIN
    
    SET @CreateTableSql += CONCAT(',Q',@Counter,' NVARCHAR(100)')
    SET @Counter+=1;
END
SET @CreateTableSql+=')'
PRINT @CreateTableSql

EXEC sp_executesql @CreateTableSql


SET @SQL = 'SELECT EmpID,CourseID,'+@VALS+' FROM Tbl_Eval
           PIVOT(MIN([Answers]) FOR [Questions] IN ('+@VALS+')) PIV'
PRINT @SQL
INSERT INTO Tbl_Eval_Temp EXEC(@SQL)
SELECT * FROM Tbl_Eval_Temp
DROP TABLE #VALS

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。