Sql server 必须声明表变量"@表“;?

Sql server 必须声明表变量"@表“;?,sql-server,tsql,stored-procedures,sql-server-2012,Sql Server,Tsql,Stored Procedures,Sql Server 2012,所以这可能只是我对过程了解不够的问题,但我正在尝试创建一个过程,更新表中的一列以删除尾随空格,因为这是我们最近工作中经常遇到的情况 这是因为我们正处于从旧系统到新系统的过渡阶段,所以我们还制作了一个新的数据库。旧数据库使用nvarchar nchar,这意味着即使您不使用字符的所有插槽,它也会用空格填充其余插槽。在新的数据库中,虽然我们使用了varchar,但我们希望去掉空白 所以这很方便: UPDATE table SET column = LTRIM( RTRIM( column ) );

所以这可能只是我对过程了解不够的问题,但我正在尝试创建一个过程,更新表中的一列以删除尾随空格,因为这是我们最近工作中经常遇到的情况

这是因为我们正处于从旧系统到新系统的过渡阶段,所以我们还制作了一个新的数据库。旧数据库使用nvarchar nchar,这意味着即使您不使用字符的所有插槽,它也会用空格填充其余插槽。在新的数据库中,虽然我们使用了varchar,但我们希望去掉空白

所以这很方便:

UPDATE table SET column = LTRIM( RTRIM( column ) );
所以我试着用它做一个程序,因为我们必须偶尔使用它:

USE omitted
GO
CREATE PROCEDURE TrimTrailingSpaces
  @table  VARCHAR(50),
  @column VARCHAR(50)
AS
BEGIN
UPDATE @table
SET
    @column = LTRIM( RTRIM( @column ) );
END
GO
但每当我尝试执行此操作时,就会出现错误:

Msg 1087,级别16,状态1,过程TrimTrailingSpaces,第6行[批处理起始行2]:必须声明表变量“@table”

我所做的是不可能的吗

USE omitted
GO
CREATE PROCEDURE TrimTrailingSpaces
  @table_name  VARCHAR(50),
  @column_name VARCHAR(50)
AS
BEGIN
declare @sql varchar(200);
set @sql='UPDATE ' + QUOTENAME(@table_name) 
     +' SET '+  @column_name+ ' = LTRIM( RTRIM( ' + QUOTENAME(@column_name) +' ) )';
END
GO

为此,您需要使用动态sql。无法在更新查询中将表名作为变量给定。在SQL中将变量名更改为关键字以外的名称。

如何执行存储过程?@MitchWheat那么请解释为什么数据库中始终有空格,而我们不添加这些空格。
旧数据库使用nvarchar,这意味着即使您不使用所有的字符槽,它将用空格填充剩余的插槽
——这不是
nvarchar
varchar
之间的区别!您正在考虑
varchar
char
nchar
nvarchar
之间的区别不要从nchar更改为varchar,您应该已经做到了nvarchar@Jamiec提出了一个很好的观点。从nChar切换到VarChar可能会导致数据丢失。取而代之的是考虑NVARCHAR。这些数据类型的n个版本消耗更多的存储空间,但支持更广泛的字符范围。有关差异的更多信息,请参见本文。在构造动态sql时,您应该注意以下几点。可以帮助减少攻击的机会。Exmaple:
SET@sql='UPDATE'+QUOTENAME(@table_name)+'SET…
@destination data感谢您的建议。修改了我的答案,将其包括在内。
USE omitted
GO
CREATE PROCEDURE TrimTrailingSpaces
  @table  VARCHAR(50),
  @column VARCHAR(50)
AS
BEGIN

declare @sql varchar(max)
set @sql='UPDATE '+@table+'
SET
    '+@column+' = LTRIM( RTRIM( '+@column+' ) );
END'

execute(@sql)
end
go