博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER动态列名
阅读量:4630 次
发布时间:2019-06-09

本文共 2820 字,大约阅读时间需要 9 分钟。

在ms sql server实现动态呈现列的方法很多。下面Insus.NET解决也算是另外一种参考。

如:

 

准备实现功能的数据:

 

CREATE TABLE [dbo].[Timing] ([When] NVARCHAR(10) NOT NULL PRIMARY KEY)INSERT INTO [dbo].[Timing]  VALUES     (N'周五.晚上'),    (N'周六.中午'),    (N'周六.晚上'),    (N'周日.中午'),    (N'周日.晚上')GOSELECT [When] FROM [dbo].[Timing]GO
Source Code

 

另一份数据:

 

CREATE TABLE [dbo].[Schedule] (    [ID] INT IDENTITY(1,1) PRIMARY KEY,    [Name] NVARCHAR(40),    [When] NVARCHAR(10) FOREIGN KEY REFERENCES [dbo].[Timing]([When]))GOINSERT INTO [dbo].[Schedule] ([NAME],[When]) VALUES (N'EMP-00201',N'周六.晚上'),(N'EMP-00201',N'周日.中午'),(N'EMP-00202',N'周六.中午'),(N'EMP-00202',N'周六.晚上'),(N'EMP-00202',N'周日.中午'),(N'EMP-00207',N'周五.晚上'),(N'EMP-00207',N'周六.中午'),(N'EMP-00207',N'周日.中午'),(N'EMP-00209',N'周五.晚上'),(N'EMP-00209',N'周六.中午'),(N'EMP-00209',N'周六.晚上')GOSELECT [NAME],[When] FROM [dbo].[Schedule]GO
Source Code

 

一切准备完毕,开始实现,创建一张临时表,将用来存储实现的数据。

 

IF OBJECT_ID('tempdb..#Temp_Result_Rpt') IS NOT NULL DROP TABLE #Temp_Result_Rpt  CREATE TABLE #Temp_Result_Rpt(       [Name] NVARCHAR(40) )
Source Code

 

下面是处理动态列,把[dbo].[Timing]的数据转换为列,把它们处理为[xxx],[yyy],[zzz]...逗号串连在一起。

 

DECLARE @Comma_Delimited_Column_Names NVARCHAR(MAX)EXECUTE [dbo].[usp_TableColumnValueToCommaDelimitedString] '[Timing]','[When]',@Comma_Delimited_Column_Names OUTPUTSELECT @Comma_Delimited_Column_Names
Source Code

 

上面有一个自定义函数[dbo].[usp_TableColumnValueToCommaDelimitedString],它的实现方法,可以参考这里《》:

 

定义一个变量,

DECLARE @TABLE_NAME SYSNAME = N'#Temp_Result_Rpt'

给变量赋的值就是上面的创建的临时表名。

这个变量,将在下面的代码中使用得到。

 

接下来,我们需要把上面得到的动态列名,修改至临时表中去:

DECLARE @Source NVARCHAR(MAX) = @Comma_Delimited_Column_Names + N','WHILE CHARINDEX(',', @Source) > 0BEGIN    DECLARE @DATA_TYPE SYSNAME = N'NVARCHAR(10)'    DECLARE @COLUMN_NAME SYSNAME = SUBSTRING(@Source, 0, CHARINDEX(',', @Source))    SET @Source = LTRIM(RTRIM(SUBSTRING(@Source, CHARINDEX(',', @Source) + 1, LEN(@Source))))     EXECUTE('ALTER TABLE '+ @TABLE_NAME +' ADD '+ @COLUMN_NAME +' '+ @DATA_TYPE +' DEFAULT(N'''')')ENDEXECUTE('SELECT [Name],'+ @Comma_Delimited_Column_Names +' FROM '+ @TABLE_NAME +'')
Source Code

 

得到空表格,最后的动作,是需要把原始数据合并至这张临时表中。

有记录的,进行更新,没有记录的,插入新记录:

 

DECLARE @r INT = 1,@rs INT = 0SELECT @rs = MAX([ID]) FROM [dbo].[Schedule]WHILE @r <= @rsBEGIN    DECLARE @Name nvarchar(40)    SELECT @COLUMN_NAME = [When],@Name = [Name] FROM [dbo].[Schedule] WHERE [ID] = @r        EXECUTE('        IF EXISTS(SELECT TOP 1 1 FROM '+ @TABLE_NAME +' WHERE [NAME] = N'''+ @NAME +''')            UPDATE '+ @TABLE_NAME +' SET ['+ @COLUMN_NAME +']  = N''✔'' WHERE [NAME] = N'''+ @NAME +'''        ELSE            INSERT INTO '+ @TABLE_NAME +' ([NAME],['+ @COLUMN_NAME +']) VALUES(N'''+ @NAME +''',N''✔'')        ')    SET @r = @r + 1ENDEXECUTE('SELECT [Name],'+ @Comma_Delimited_Column_Names +' FROM '+ @TABLE_NAME +'')
Source Code

 

完成!

其中使用了很多动态SQL。

 

转载于:https://www.cnblogs.com/insus/p/10947429.html

你可能感兴趣的文章
分享下自己写的一个微信小程序请求远程数据加载到页面的代码
查看>>
微软技术的变迁
查看>>
从网络上获取一张图片简单的
查看>>
大道至简第一章读后感
查看>>
迷宫寻宝(搜索)
查看>>
LIKE 操作符
查看>>
15:解决IntelliJ IDEA的乱码问题
查看>>
python2和python3的区别
查看>>
Entity Framework的启动速度优化
查看>>
input 选择框改变背景小技巧
查看>>
Hadoop2.6.0伪分布环境搭建
查看>>
贴现因子
查看>>
2019-03-20 Python爬取需要登录的有验证码的网站
查看>>
docker(4)docker的网络,自定义网桥
查看>>
重读TCP协议(3)
查看>>
彻底解决Linux索引节点(inode)占用率高的告警
查看>>
阻塞队列与非阻塞队列
查看>>
python学习07
查看>>
添加MySql数据库超时设置的相关问题
查看>>
-lt -gt -ge -le -eq的意义
查看>>