sql-server - 如何在 SQL-Server 存储过程中编辑记录
问题描述
我想知道 SQL-Server 中的 SQL 语句如何从只读变为可编辑的秘密。右键单击任何表,界面给出“选择”或“编辑”记录的选项。SQL 语句中是否有将记录集指定为可编辑或只读的属性?
我将使用最简单的示例:我设计了一个包含两个字段的表:一个整数字段,指定为标识和唯一索引。第二个是 nvarchar,专为手动编辑而设计。编写查询窗口,我为表编写 SQL 语句,但无法编辑文本字段。此外,我喜欢存储过程,因为我可以以最大的效率调用它们,它也会呈现不可编辑的记录集。我发现成功的唯一方法是在 SSMS 中选择表格上的编辑功能。
我广泛使用 Microsoft Access,Access 托管的所有表都链接到 SQL-Server 表。当我使用 Microsoft Access JET 引擎在这些相同的表上编写查询时,我可以编辑查询生成的记录集,但当我使用传递查询在表函数或存储过程中调用相同的内容时不能。由于没有表连接、没有计算字段,也没有其他任何会导致我无法编辑记录集的已知原因,因此无法生成我的一些可交付成果是一个障碍。
提前感谢您的支持。以下是快速示例:
Select
IDField
, TextField
From
SampTable
Create Procedure TestProc
AS
BEGIN
Select
IDField
, TextField
From
SampTable
END
Create FUNCTION [dbo].[TestFunction]()
RETURNS TABLE
AS
RETURN
(
Select
IDField
, TextField
From
SampTable
)
解决方案
SQL Server 与 MS Access 不同。MS access同时是前端和后端的结合,对用户来说既好又方便,确实有它的位置。这就像一个增强版的 excel,具有一些非常有限的多用户功能。但是对于 SQL Server,期望是您在前端和后端之间划分职责。
是的,SSMS 确实提供了右键单击表(或引用一个表的视图)和“编辑前 200 行”的功能。老实说,我希望它没有。它不应该。
如果您在“后端”中使用 SQL Server 中的链接表访问“前端”,那么这就是类似的功能。是的,在一些有限的用例中,这是一种适当的解决方案,理想情况下是暂时的。但实际上,如果您将数据放入 SQL Server,则期望您正在构建某种“真正的”用户界面,它使用由应用程序构建的 DML 语句、存储过程执行或某种 ORM 和DBContext,修改数据。即使在 MS Access 中,您也应该从直接表格编辑切换到表单。
不能编辑存储过程或函数结果的原因是这些对象的输出只是数据的临时副本。这不是“表中的实际数据”。而且,如果你仔细想想,怎么可能?例如,想象一下如果我写了一个这样的存储过程:
create table t (i int primary key, j int);
create procedure p as begin
select total_j = sum(j) from t;
end
当我运行该存储过程时,我将得到一个值,它是所有行中 j 的总和。我怎么能编辑这个值?如果我将其从 100 更改为 200,那么就表中 j 列的内容而言,这意味着什么?我是否将 100 添加到任意行?我是否按主键的顺序向前 100 行中的每一行添加 1?这个概念变得不连贯。
我知道你在想什么:“但是如果我的存储过程没有聚合怎么办?那么返回的数据肯定只是指向表中数据的“指针”,而不是副本?. 是的,原则上这可能是真的。但是想想它的含义。当您查看结果时,其他任何人都可以更改表中的基础数据吗?你能同时改变它吗?谁来决定如何解决这个问题——SQL 引擎?其他人可以在您编辑数据时删除表格吗?等等等等。
这是考虑 SQL Server(或任何“真实”数据库引擎)的错误方式。您作为选择结果看到的数据是从表中读取的,并通过网络作为您自己的个人副本发送到客户端。它不再连接到它来自的表。
哦...如果您想知道如果您在 MS Access 中使用链接表,如何“直接在表中”编辑数据:您仍然不能。Access 在幕后为您完成了一些工作。为了证明这一点,请尝试将 SQL Server 表链接到 MS Access,然后在 access 中拉出行并开始编辑它。然后,在完成编辑之前,进入 SSMS 并更新您正在访问中编辑的行。然后尝试在 Access 中保存您的更改。
推荐阅读
- angular - 在 Ionic / Angular 离子卡上创建 DOM 过滤器
- list - 我无法将数据从屏幕传输到列表,我尝试了 hive,但我无法组合数据结构,因为它没有生成 g.dart 文件
- .net-core - 如何更改 DevExtreme 日历上的月份描述?
- c - C将char数组初始化为字符串,但尝试printf时为空
- ios - 尽管已正确初始化,XIB 视图仍不显示任何内容
- macos - Mac OS 上的新 Outlook 不会创建日志文件
- javascript - React:url中的props变量不收集数据
- python - 二维系统的欧拉方法
- windows - 与光标位置相关的奇怪的 Delphi IDE 行为
- node.js - 如何使用 angular 11 在 ionic.io 上创建全局组件?