内容简介:在ms sql server实现动态呈现列的方法很多。下面Insus.NET解决也算是另外一种参考。如:
在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'周日.晚上')
GO
SELECT [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])
)
GO
INSERT 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'周六.晚上')
GO
SELECT [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 OUTPUT SELECT @Comma_Delimited_Column_Names Source Code
上面有一个自定义函数[dbo].[usp_TableColumnValueToCommaDelimitedString],它的实现方法,可以参考这里《 数据表列值转换为逗号分隔字符串 》 https://www.cnblogs.com/insus/p/10848578.html :
定义一个变量,
DECLARE @TABLE_NAME SYSNAME = N'#Temp_Result_Rpt'
给变量赋的值就是上面的创建的临时表名。
这个变量,将在下面的代码中使用得到。
接下来,我们需要把上面得到的动态列名,修改至临时表中去:
DECLARE @Source NVARCHAR(MAX) = @Comma_Delimited_Column_Names + N','
WHILE CHARINDEX(',', @Source) > 0
BEGIN
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'''')')
END
EXECUTE('SELECT [Name],'+ @Comma_Delimited_Column_Names +' FROM '+ @TABLE_NAME +'')
Source Code
得到空表格,最后的动作,是需要把原始数据合并至这张临时表中。
有记录的,进行更新,没有记录的,插入新记录:
DECLARE @r INT = 1,@rs INT = 0
SELECT @rs = MAX([ID]) FROM [dbo].[Schedule]
WHILE @r <= @rs
BEGIN
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 + 1
END
EXECUTE('SELECT [Name],'+ @Comma_Delimited_Column_Names +' FROM '+ @TABLE_NAME +'')
Source Code
完成!
其中使用了很多动态SQL。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- SQLServer获取临时表所有列名或是否存在指定列名的方法
- pandas 修改 DataFrame 列名
- 不知道列名的情况下注入
- postgresql – 在postgres中将表列名更改为大写
- MySQL列名中包含斜杠或者空格的处理方法
- PostgreSQL11: psql 新增 \gdesc 显示查询结果的列名和类型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MacTalk 人生元编程
池建强 / 人民邮电出版社 / 2014-2-1 / 45
《MacTalk·人生元编程》是一本随笔文集,主要内容来自作者的微信公众平台“MacTalk By 池建强”。本书撰写于2013年,书中时间线却不止于此。作者以一个70 后程序员的笔触,立于Mac 之上,讲述技术与人文的故事,有历史,有明天,有技术,有人生。70 多篇文章划分为六大主题:Mac、程序员与编程、科技与人文、人物、工具、职场。篇篇独立成文,可拆可合,随时阅读。 此外,作者还对原来......一起来看看 《MacTalk 人生元编程》 这本书的介绍吧!