sql-server - 我想编写一个通用存储过程来将数据插入数据库的任何表中

标签 sql-server stored-procedures

我有 6 个具有不同字段的表。我想动态访问表名。有什么想法可以做到吗? 我的代码如下,这是一个简单的过程,我想使其动态地在 C# 中使用。怎么办?

Create procedure [dbo].[Insert_Data] (@Id int,@FeesHead nchar(20),@Fees int,@Remarks nchar(20))
as 
   begin 
      Insert into FeesHead(ID,FeesHead,Fees,Remarks)values(@Id,@FeesHead,@Fees,@Remarks)
   End

最佳答案

不要去那里。
这是一个坏主意,因为您最终会得到一个又长又低效的存储过程,该存储过程容易受到 SQL 注入(inject)攻击并出现性能问题。
为每个表编写一个插入存储过程是正确的方法。

您写道,您有六个具有不同列的不同表,因此编写一个存储过程来处理所有这些表的插入将需要您发送所有列的所有参数以及表名称的参数和嵌套的if...else 有 6 个可能的路径,每个表一个。
这最终会成为一段又长、又乱、写得不好的代码,在每个参数上都很糟糕:安全性、性能、代码可读性和可维护性。

实现这一目标的唯一方法是为每个表编写单独的插入存储过程,然后编写一个存储过程,该存储过程将采用所有可能的参数和表名称,并在其中决定什么插入要根据表名参数的值执行的存储过程。 但是,您最好将这些条件留给 SQL 客户端(在本例中为您的 C# 代码),然后再留给 SQL Server。

关于sql-server - 我想编写一个通用存储过程来将数据插入数据库的任何表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30684337/

相关文章:

mysql - 转移过程执行上下文

MySQL 存储过程重复问题

sql-server - SQL Server 约束不会保存我定义它的方式

sql-server - SQL Server 错误预期 1 个导出,契约(Contract)名称为 Microsoft.VisualStudio.Utilities.IContentTypeRegistryService

MySQL规范化存储过程性能

sql - 使用调用过程的立即执行语句中的输出参数

sql-server - 检查约束以避免字符串上出现空格

sql - 获取不在数据库中的范围

c# - 避免从 C# 代码在 MSSQL Server 上进行 SQL 注入(inject)的算法?

mysql - 使用 MySql-Commandlineclient 执行备份