必须声明表变量“@table”?

时间:2016-10-26 08:21:48

标签: sql-server tsql stored-procedures sql-server-2012

所以这可能只是我不了解过程的问题,但我正在尝试创建一个更新表中列的过程以删除尾随空格,因为它是我们最近在工作中经常出现的事。 / p>

这是因为我们处于从旧系统到新系统的过渡阶段,因此我们还建立了一个新的数据库。旧数据库使用 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,Level 16,State 1,Procedure TrimTrailingSpaces,Line 6 [Batch Start Line 2]:必须声明表变量“@table”。

我正在做的事情是不可能的吗?

2 个答案:

答案 0 :(得分:5)

scatterD3

您需要使用动态sql。表名不能作为UPDATE查询中的变量给出。还要将变量名称更改为SQL中的关键字以外的其他关键字。

答案 1 :(得分:1)

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