Sql 何时使用存储过程插入?

Sql 何时使用存储过程插入?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我将使用我制作的程序来操作数据库,我仍然不确定是否应该编写一个存储过程来插入新行 第一张桌子 name_code varchar(10) primary key, date_ka datetime not null, amount int not null 第二张桌子 code_z int primary key, date_z datetime not null, name_code varchar(10) not null, constraint FK_Key foreign key(na

我将使用我制作的程序来操作数据库,我仍然不确定是否应该编写一个存储过程来插入新行

第一张桌子

name_code varchar(10) primary key,
date_ka datetime not null,
amount int not null
第二张桌子

code_z int primary key,
date_z datetime not null,
name_code varchar(10) not null,
constraint FK_Key foreign key(name_code) references First_table(name_code)

我认为应该使用存储过程来插入第二个表,这样我就可以检查第一个表中是否存在主键等。如果我错了,请纠正我。

由于外键约束,在尝试插入第一个表中不存在的名称代码值时,您会出错:

INSERT语句与外键约束冲突 “FK_键”。数据库“YourDatabaseName”表中发生冲突 “dbo.First_Table”,列“name_code”。 声明已终止


在这种情况下,不会在第二个\u表中插入任何行。

由于外键约束,在尝试为第一个\u表中不存在的名称\u代码插入值时,会出现错误:

INSERT语句与外键约束冲突 “FK_键”。数据库“YourDatabaseName”表中发生冲突 “dbo.First_Table”,列“name_code”。 声明已终止


在这种情况下,不会将任何行插入第二个_表。

就我个人而言,我喜欢使用stoed过程来完成所有操作,即使是简单的select语句。这种方法有许多好处,例如:

  • 安全。应用程序的用户不能直接访问表,只能访问存储过程
  • 封装。应用程序不需要知道表的结构——它只处理存储过程,所以只需要知道存储过程的参数和输出
  • 易于维护(源于2)。如果需要在数据库级别更改某些内容,则无需重新编译,只要存储过程的参数和输出保持不变
    就我个人而言,我喜欢用一个简单的select语句来完成任何事情。这种方法有许多好处,例如:

  • 安全。应用程序的用户不能直接访问表,只能访问存储过程
  • 封装。应用程序不需要知道表的结构——它只处理存储过程,所以只需要知道存储过程的参数和输出
  • 易于维护(源于2)。如果需要在数据库级别更改某些内容,则无需重新编译,只要存储过程的参数和输出保持不变

    通常您不应该执行此检查-SQL Server将为您执行此检查。我知道,但不需要sp?存储过程取决于几个不同的因素。如果您试图仅在SQL中一次插入大量记录,那么存储过程可能会工作。如果您能够使用某种托管代码(.NET、Java等)来为您处理错误,那么就没有必要了。我敢肯定,SQL中的常规错误处理甚至可以做一些事情,但用问题中给出的内容无法判断。@krillgar我只是忘了提到第二个表中的主键是
    default
    ,因此它将继续增加。如果我输入了一个无效的外键,即使它没有被插入,它也会增加(codez),对吗?那么,在这种情况下,存储过程不是必须的吗?我不确定它是否必须,但这又有什么关系呢?谁会在意您的标识列是否因为某些内容被删除或插入失败而从10变为12?通常您不应该执行此检查-SQL Server会为您执行此检查我知道,但不需要sp?存储过程取决于几个不同的因素。如果您试图仅在SQL中一次插入大量记录,那么存储过程可能会工作。如果您能够使用某种托管代码(.NET、Java等)来为您处理错误,那么就没有必要了。我敢肯定,SQL中的常规错误处理甚至可以做一些事情,但用问题中给出的内容无法判断。@krillgar我只是忘了提到第二个表中的主键是
    default
    ,因此它将继续增加。如果我输入了一个无效的外键,即使它没有被插入,它也会增加(codez),对吗?那么,在这种情况下,存储过程不是必须的吗?我不确定它是否必须,但这又有什么关系呢?谁会在意您的标识列是否因为某些内容被删除或插入失败而从10变为12?我知道,换句话说,不需要使用存储过程?我只是忘了提到第二个表中的主键是“default”,因此它将继续增加。我相信如果我没有插入(就像你给出的例子),即使我没有插入,它也会单独增加,对吗?所以我需要一个sp来检查而不是插入?我想你的意思是它是一个标识列?然后是,如果插入失败,该值将增加。这通常不是身份栏的问题,因为它们没有真正的意义。当它应该是一个squential数字时,您就不应该使用identity。我知道,换句话说,不需要使用存储过程?我只是忘了提到第二个表中的主键是“default”,因此它将继续增加。我相信如果我没有插入(就像你给出的例子),即使我没有插入,它也会单独增加,对吗?所以我需要一个sp来检查而不是插入?我想你的意思是它是一个标识列?然后是,如果插入失败,该值将增加。这通常不是身份栏的问题,因为它们没有真正的意义。当它应该是一个序列号时,那么您就不应该使用标识。同样出于测试目的,examle tsqlt可用于在签入时自动测试SP。同样出于测试目的,examle tsqlt可用于自动测试SP