首页 > 解决方案 > 我可以在存储过程的 SQL 更新中将列名作为输入参数传递吗

问题描述

CREATE PROCEDURE [dbo].[AddtoCurrent]
    @devname varchar(50),
    @currentmonth datetime,
    @ErrorType int,
    @ErrorTimes int
AS
BEGIN  
    UPDATE IssueLogByType
    SET  @ErrorType =  @ErrorType +  @ErrorTimes 
    WHERE Name = @devname  AND Month = @currentmonth
END

其中,@ErrorType是列名。但是在数据库中,这被保存为 int

这是工作声明的示例

UPDATE IssueLogByType
SET Link =  Link +  @5
WHERE Name = 'John Doe' AND Month = 'January'

有没有办法在这个存储过程的 SQL 更新中将列名作为输入参数传递?

标签: sql

解决方案


您不能将列名作为参数传递,但您可以使用动态 sql解决问题并解决问题。

基本上,您将 sql 编写为字符串,然后执行它。这是一个使用 Oracle PL/SQL 的示例。

create or replace procedure prc_example_dynamic_sql(pc_column_name in varchar2
                                                   ,pc_column_value in varchar2
                                                   ,pc_primary_key in number) is
  --
  v_query varchar2(2000);
  --
begin
  --
  v_query := 'update my_table set ' || pc_column_name || ' = :p_value where my_id = :p_id';

  execute immediate v_query using pc_column_value, pc_primary_key;
  --
end prc_example_dynamic_sql;

请记住,由于 SQL 注入,此解决方案可能是一个安全问题,因此请确保绑定用户提供的值并仅在其值不是来自用户输入时才连接列名。

似乎您的示例使用的是 SQL Server,所以这里有一个关于如何使用动态 sql 的好教程。


推荐阅读