SQL动态列查询

数据库中为了实现表格数据的自由设置,我们经常设计纵表,或者列定义的表(如下KeyValue),定义一个列超级多的表中每个字段的意义。
但是在设计时简单的东西却很容易被人们忘记,如下一个简单但是很松散的列表查询。

 

--CREATE TABLE KeyValue
--(
--[key] NVARCHAR(50) ,
--[value] NVARCHAR(50)
--)

CREATE TABLE TableNumber
(
Name NVARCHAR(50),
Filed1 NVARCHAR(50),
Filed2 NVARCHAR(50),
Filed3 NVARCHAR(50),
Filed4 NVARCHAR(50),
Filed5 NVARCHAR(50),
)
INSERT INTO dbo.TableNumber
        ( Name ,
          Filed1 ,
          Filed2 ,
          Filed3 ,
          Filed4 ,
          Filed5
        )
VALUES  ( N'张三2' , -- Name - nvarchar(50)
          N'中国2' , -- Filed1 - nvarchar(50)
          N'河北2' , -- Filed2 - nvarchar(50)
          N'唐山2' , -- Filed3 - nvarchar(50)
          N'' , -- Filed4 - nvarchar(50)
          N''  -- Filed5 - nvarchar(50)
        )

INSERT INTO KeyValue VALUES('Filed1','国家')
INSERT INTO KeyValue VALUES('Filed2','')
INSERT INTO KeyValue VALUES('Filed3','')


DECLARE @msg NVARCHAR(max)=''
SELECT @msg=@msg+','+[key]+' as '+value  FROM KeyValue 

SET @msg='Name as 名称'+@msg;

DECLARE @sql NVARCHAR(max);
SET @sql='select '+@msg +' from TableNumber'

EXEC( @sql)

 

这种设计可用于自定义列表查询,EXCEL导出,很方便,使用起来比在C#中写更便捷,不过缺点就是依赖数据库。

转载于:https://www.cnblogs.com/stjwy/p/6087528.html

### 如何在 SQL Server 中创建具有动态列查询 为了实现在 SQL Server 中创建带有动态列查询,可以采用多种方法来适应不同的需求场景。一种常见的方式是通过构建动态 SQL 来实现这一目标。 #### 使用 `PIVOT` 和 `UNPIVOT` 进行动态转换 当需要将行数据转化为或将数据转为行,`PIVOT` 和 `UNPIVOT` 是非常有用的工具。然而,在处理未知数量的的情况下,则需先获取这些的名字并将其嵌入到动态 SQL 查询中去执行。 对于不确定具体有多少个不同值作为新的名的情况,可以通过编脚本来自动生成所需的 PIVOT 或 UNPIVOT 语句: ```sql DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) -- 获取所有可能成为新名称的数据项,并拼接成逗号分隔的形式 SELECT @cols = STRING_AGG(QUOTENAME(column_name), ',') FROM ( -- 此处应替换为实际业务逻辑所涉及的具体字段以及过滤条件 SELECT DISTINCT column_name FROM information_schema.columns WHERE table_name = 'YourTableName' ) t SET @query = ' SELECT * FROM YourTableName src PIVOT( MAX(src.value_column) FOR src.column_to_pivot IN (' + @cols + ') ) pvt ' EXEC sp_executesql @query; ``` 上述代码片段展示了如何利用 T-SQL 动态生成包含所需查询语句[^1]。这里的关键在于使用了 `STRING_AGG()` 函数收集所有的潜在名,并把它们构造成一个适合于后续使用的表形式。之后再把这个字符串变量插入到最终要被执行的大括号内的部分,从而实现了真正意义上的“动态”。 另一种方式涉及到更复杂的操作比如聚合函数的应用或者是基于某些特定规则来自定义计算得的结果集中的额外临等情形下,也可以考虑运用 Common Table Expressions (CTEs),窗口函数或者其他高级特性来辅助完成任务。 最后值得注意的是,虽然这种方法提供了极大的灵活性,但在性能方面可能会有所牺牲,尤其是在面对大量数据的候。因此建议仅限于确实有必要这样做的场合之下应用此类技术方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值