【问题标题】:Must Declare the table variable "@table"?必须声明表变量“@table”?
【发布时间】:2017-03-08 12:24:18
【问题描述】:

所以这可能只是我对程序了解不够的问题,但我正在尝试制作一个更新表中的列以删除尾随空格的程序,因为这是我们最近工作中经常发生的事情。

这是因为我们正处于从旧系统到新系统的过渡阶段,所以我们也做了一个新的数据库来配合这个。旧数据库使用 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”。

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

【问题讨论】:

  • 如何执行你的存储过程?
  • @MitchWheat 那么请解释一下为什么数据库中始终有空格,而我们不添加这些空格。
  • The old Database used nvarchar which means that even if you don't use all the slots for characters, it will fill the rest of the slots with spaces - 这不是nvarcharvarchar 之间的区别!您正在考虑 varcharcharncharnvarchar 之间的区别
  • 不要从 nchar 改成 varchar,你应该把它改成 nvarchar
  • @Jamiec 提出了一个很好的观点。从 nChar 切换到 VarChar 可能会导致数据丢失。请考虑使用 nVarChar。这些数据类型的 n 个版本消耗更多存储空间,但支持更广泛的字符。有关差异的更多信息,请参阅此question

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


【解决方案1】:
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。表名不能作为 UPDATE 查询中的变量给出。还将变量名称更改为 SQL 中的关键字以外的名称。

【讨论】:

  • 在构造动态 sql 时,你应该知道sql injectionQuoteName 可以帮助减少攻击的机会。示例:SET @sql = 'UPDATE ' + QUOTENAME(@table_name) + ' SET....
  • @destination-data 感谢您的建议。修改了我的答案以包含它。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多