从 table 中的列中删除字符的存储过程不起作用

Stored Procedure to remove characters from a column in a table, does not work

我正在尝试编写一个存储过程,我可以向其传递一个列名和一个不需要的字符,该存储过程将删除该列中该不需要的字符的所有实例。

以下 SQL 是我的存储过程的基础,当我从 SQL Server Management Studio 执行它时,它可以工作:

UPDATE MyTable
SET MyField = REPLACE(MyField, 'T', '');

但是如果我写一个存储过程,那么:

CREATE PROCEDURE uspRemoveCharFromColumn 
    @Fieldname nvarchar(50), 
    @UnwantedChar char(1)
AS
BEGIN
    UPDATE MyTable
    SET @Fieldname = REPLACE(@Fieldname, @UnwantedChar, '');
END 

并执行它,因此:

EXEC uspRemoveCharFromColumn 'ADDR', 'T';

SELECT ADDR 
FROM MyTable 
WHERE ADDR LIKE '%T%';

我发现 "T" 中的 none 已从该列的任何字段内容中删除。

我花了最后 45 分钟 Google-ing 是因为我的存储过程无法正常工作,结果是空的。有人可以帮忙吗?

使用动态 SQL:

您正在尝试将 Column_Name 作为参数传递,因此您需要使用 Dynamic_SQl

CREATE PROCEDURE uspRemoveCharFromColumn 
    @Fieldname nvarchar(50), 
    @UnwantedChar char(1)
AS
BEGIN
    declare @qry varchar(max)
Set @qry ='UPDATE MyTable
SET '+ @Fieldname +'= REPLACE('+@Fieldname+','''+@UnwantedChar+''', '''')'

EXECUTE(@qry)

END 

在更新查询中将列名放入变量中不会更新table中的列数据。您需要通过附加列名来格式化查询。然后使用 sp_executesql

执行查询

使用 'EXECUTE' 命令可以打开 SQL 注入。使用 sp_execute 命令保护自己免受 SQL 注入。

ALTER PROCEDURE uspRemoveCharFromColumn 
    @Fieldname nvarchar(50), 
    @UnwantedChar char(1)
AS
BEGIN
    DECLARE @qry NVARCHAR(MAX);
    DECLARE @paramDefinition NVARCHAR(500) = '@Fieldname VARCHAR(50), @UnwantedChar VARCHAR(5)';
    SET @qry ='UPDATE MyTable SET @Fieldname = REPLACE(@Fieldname,@UnwantedChar,'''')';

    EXEC sp_executesql @qry,@paramDefinition,@Fieldname,@UnwantedChar;
END