sql - 将列名动态插入函数
问题描述
我尝试将列名插入到我的查询中以获得基础数据输入的最大长度,例如:
DECLARE @cols AS varchar(MAX)
,@query AS nvarchar(MAX)
SELECT @cols = (
select STRING_AGG(COLUMN_NAME, ',')
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='mytbl'
and TABLE_SCHEMA = 'dbo'
and DATA_TYPE = 'varchar'
)
set @query = 'select top(1) max(datalength(' + @cols + ')) FROM dbo.mytbl'
exec sp_executesql @query;
..提示以下错误:
The datalength function requires 1 argument(s).
我不知道如何转换字符串,以便 @cols 被封装的 max(datalength()) 函数识别。任何想法如何规避这个错误?我没主意了。
更新:预期的输出应该是这样的:
select max(datalength(col1))
,max(datalength(col2))
,max(datalength(col3))
,max(datalength(col4))
...
from dbo.mytable
它可以工作并为我提供每列任何输入的最大字符,例如:
解决方案
您需要在连接之前在列上应用MAX()
andDATALENGTH()
更改@cols
为
SELECT @cols = (
select STRING_AGG('MAX(DATALENGTH(' + COLUMN_NAME + '))', ',')
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='mytbl'
and TABLE_SCHEMA = 'dbo'
and DATA_TYPE = 'varchar'
)
而决赛@query
只是一个简单的select
set @query = 'select ' + @cols + ' FROM dbo.mytbl'
在执行之前,您应该print
检查查询
print @query
推荐阅读
- twitter-bootstrap - Bootstrap 全角列
- python - 如何创建一个全局变量,其值是基于类上的对象计算的?
- python - 使用循环使用 pandas 转换多个数据帧
- kotlin - 了解 Kotlin 的收益函数
- java - 实现接口以调用相同方法的类数组
- arrays - Stat.exists false 与 ansible 中的变量列表
- java - Spring Boot JPA - 无法获取分页嵌套资源
- objective-c - CLLocationManager didRangeBeacons 停止在前台工作
- xtext - 在 XText Eclipse DSL 工具版本中生成 EMF 模型代码的异常:2019-03 RC1 (4.11 RC1) - Windows 10
- reactjs - 通过道具传递给孩子的反应执行委托