首页 > 解决方案 > 将列名动态插入函数

问题描述

我尝试将列名插入到我的查询中以获得基础数据输入的最大长度,例如:

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

它可以工作并为我提供每列任何输入的最大字符,例如:

在此处输入图像描述

标签: sqlsql-server

解决方案


您需要在连接之前在列上应用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

推荐阅读