SQL Server:如何对表的所有varchar列执行Rtrim

SQL Server:如何对表的所有varchar列执行Rtrim,sql,sql-server,sql-server-2008,string,Sql,Sql Server,Sql Server 2008,String,我的表中有30多列(SQLServer2008)。列类型为varchar(x)。我知道在每一列中,在列值的末尾有两个额外的空格。如何对所有列使用rtrim函数并将此修改保存到此现有表中 编辑:在不必手动声明所有列的情况下,是否有一种方法可以使用存储过程或游标执行此操作?对于一般方法,可以使用类似这样的脚本为给定表生成语句(如果有许多列,则很有用!): UPDATE xxx SET col1 = RTRIM(col1), col2 = RTRIM(col2), col3

我的表中有30多列(SQLServer2008)。列类型为varchar(x)。我知道在每一列中,在列值的末尾有两个额外的空格。如何对所有列使用rtrim函数并将此修改保存到此现有表中


编辑:在不必手动声明所有列的情况下,是否有一种方法可以使用存储过程或游标执行此操作?

对于一般方法,可以使用类似这样的脚本为给定表生成语句(如果有许多列,则很有用!):

UPDATE xxx
  SET col1 = RTRIM(col1),
      col2 = RTRIM(col2),
      col3 = RTRIM(col3),
      ...

这将只打印SQL语句。然后,您可以复制并运行该语句,也可以执行(@SQL)。这是未经测试的,所以只需先在测试表上试用:)

我们可以在
特定模式下使用存储过程来修剪
特定表。如果除了default
dbo
schema之外,我们有不同的模式名,那么最好通过传递模式名和表名来使用这个SP。这将执行
LTRIM
RTRIM
。此SP将检查
char
nchar
varchar
nvarchar

CREATE PROCEDURE [dbo].[TrimAllColumnsOfTable] @SchemaName Varchar(100),@TableName Varchar(100)
AS
BEGIN

DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ',[', '[') +
              COLUMN_NAME + ']=LTRIM(RTRIM([' + COLUMN_NAME + ']))'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @SchemaName AND TABLE_NAME = @TableName AND DATA_TYPE Like '%char%'

SET @SQL = 'UPDATE [' + @SchemaName + '].[' + @TableName + '] SET ' + @SQL

EXEC (@SQL)

END

用法:
[TrimAllColumnsOfTable]“SchemaName”和“TableName”

公认的答案很有效。我遇到了一个问题,临时表被命名为相同的名称。你可以加上

and TABLE_SCHEMA = 'dbo'

这将消除表名上的冲突。

这非常完美。。。但请记住,还要将
where
子句放在下面:

COLUMNPROPERTY(对象\u ID(表\u架构+'。+表\u名称)、列\u名称、'IsComputed')=0


Ohterwise如果表的计算列为
“%char%”
类型,您将得到一个错误

最好使用像“%char%”这样的
数据类型
,否则我们可能会丢失char和nchar数据类型字段。@Shiva-否。char和nchar值总是用空格填充,因此这没有任何作用。NVARCHAR可以包括在内,但OP的问题特别围绕着它VARCHARs@AdaTheDev-对<代码>像“%varchar%”这样的数据类型就可以了。
我不确定这里是否遗漏了什么,但当我在SQL Server 2008中运行此命令时,不会打印任何内容。我刚刚得到“查询执行成功”。@raoulcousins PRINT在字符串为空时不会打印任何内容。在我的例子中,我没有varchar列,只有nvarchar,所以@SQL变量是空的。将数据类型更改为nvarchar可为我生成输出。
and TABLE_SCHEMA = 'dbo'