sql - 我可以在存储过程的 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 编写为字符串,然后执行它。这是一个使用 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 的好教程。
推荐阅读
- android-studio - 没有必要将值 2> 值 1
- r - 比例来自两个不同数据帧的数字?
- html - 在省略号的情况下,红色星号不应消失
- python-3.x - Python Selenium:查找选择输入时唯一标识符变为空白的输入位置
- sql-server - 如何自定义用户的钻取功能以通过 excel 使用 SSAS 表格模型
- java - “主要”java.lang.NoSuchMethodError:'void com.google.common.base.Preconditions.checkArgument(boolean,java.lang.String,char,java.lang.Object)'
- c# - 无法从“FilesWritten”参数中检索“GenerateResource”任务的输出。对象与目标类型不匹配
- reactjs - 访问孩子的状态是否被认为可以(最佳实践)?
- python - 我想替换每个员工的日期值
- javascript - 仅当满足某个“如果”条件时,如何在 javascript 中禁用链接