Sql 将表中的所有列数据更改为大写

Sql 将表中的所有列数据更改为大写,sql,sql-server-2012,Sql,Sql Server 2012,下面的语句返回可以是字符串值的所有字段名。我现在需要将每个字段的数据改为大写 select column_name from information_schema.columns where data_type in ('char', 'nchar', 'varchar', 'nvarchar') AND table_name = 'plats'; 这是update语句 Update Plats set col1 = UPPER(col1) 如何使col1从第一条语句变成列表,这样它将一次

下面的语句返回可以是字符串值的所有字段名。我现在需要将每个字段的数据改为大写

select column_name from information_schema.columns
where data_type in ('char', 'nchar', 'varchar', 'nvarchar') AND table_name = 'plats';
这是update语句

Update Plats
 set col1 = UPPER(col1)

如何使col1从第一条语句变成列表,这样它将一次运行所有列,而不是每次更改名称。

如果是一次性操作,您可以这样做

select 'update ' + table_name + ' set ' + column_name + ' = UPPPER(' + column_name + ');')
from information_schema.columns
where data_type in ('char', 'nchar', 'varchar', 'nvarchar') AND table_name = 'plats';
在dbms管理员工具ssms中执行此操作,复制/粘贴结果并执行它

否则,您将需要一个带有动态sql的存储过程

select 'update ' + table_name + ' set ' + column_name + '= upper(' + column_name + ');'
from information_schema.columns
where data_type in ('char', 'nchar', 'varchar', 'nvarchar') 
  AND table_name = 'plats';

此查询应返回所需的update语句。结果应作为SQL语句执行。我不认为这可以在一条语句中完成。

使用类似于so的group concat类型查询将生成一条update语句

Update Plats
 set col1 = UPPER(col1)
DECLARE @qry NVARCHAR(MAX)

SELECT @qry = 'UPDATE plats SET' + STUFF(CAST((
    SELECT ', ' + QUOTENAME(COLUMN_NAME) + ' = UPER(' + QUOTENAME(COLUMN_NAME) + ')'
    FROM information_schema.columns
    WHERE data_type in ('char', 'nchar', 'varchar', 'nvarchar') AND table_name = 'plats'
    FOR XML PATH('')
) AS VARCHAR(MAX)), 1, 1, '')

PRINT @qry
-- EXEC(@qry)

我个人建议使用SQL Server中的目录视图而不是信息模式,原因有很多,但在这种情况下,最相关的一个原因是无法使用信息模式.COLUMNS来识别计算列,因此您可能会尝试更新一个计算列,这将失败。这些可以在sys.columns中通过is_computed字段识别,因此您可以从更新中排除它们。