如何编辑SQL-服务器存储过程中的记录

How to edit records in SQL-Server stored procedure

我想知道 SQL 语句在 SQL-Server 中如何从只读变为 editable 的秘密。右击任意table,界面给出“选择”或“编辑”记录选项。 SQL 语句中是否有 属性 将记录集指定为 editable 或只读?

我将使用最简单的示例:我设计了一个包含两个字段的 table:一个整数字段,指定为标识和唯一索引。第二个是 nvarchar,专为手动编辑而设计。编写查询 window,我为 table 编写 SQL 语句,但无法编辑文本字段。此外,我喜欢存储过程,因为我可以以最大的效率调用它们,它也呈现一个 uneditable 记录集。我发现成功的唯一方法是在 SSMS 中,在 table.

上选择编辑功能时

我广泛使用 Microsoft Access,Access 主机的所有 table 都链接到 SQL-Server table。当我使用 Microsoft Access JET 引擎在这些相同的 table 上编写查询时,我可以编辑查询生成的记录集,但当我使用传递查询在 [=25= 中调用相同的内容时则不能] 函数或存储过程。由于没有 table 联接,没有计算字段,也没有任何其他会强加我无法编辑记录集的已知原因,这种无能对我的一些可交付成果造成了障碍。

提前感谢您的支持。以下是快速示例:

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 服务器与 MS Access 不是一回事。 MS access同时是前端和后端的结合,对用户来说很好用,也很容易,也有它的用武之地。它就像 excel 的增强版,具有一些非常有限的多用户功能。但是对于 SQL 服务器,期望您在前端和后端之间拆分职责。

是的,SSMS 确实提供了右键单击 table(或引用一个 table 的视图)和“编辑前 200 行”的功能。老实说,我希望没有。不应该。

如果您在“后端”的 SQL 服务器中使用链接的 table 访问“前端”,这就是类似的功能。是的,在一些有限的用例中,这是一种合适的解决方案,最好是临时的。但实际上,如果您将数据放入 SQL 服务器,则期望您正在构建某种“真实的”用户界面,它使用由应用程序构建的 DML 语句,或存储过程执行,或一些一种 ORM 和 DBContext,用于修改数据。即使在 MS Access 中,您也应该从直接 table 编辑切换到表单。

您不能编辑存储过程或函数的结果的原因是这些对象的输出只是数据的临时副本。它不是“table 中的实际数据”。而且,如果您考虑一下,怎么可能呢?例如,假设我写了这样一个存储过程:

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,那么 table 中第 j 列的内容意味着什么?我是否将 100 添加到任意行?我是否按照主键的顺序在前 100 行的每一行中加 1?概念变得不连贯。

我知道你在想什么:“但是如果我的存储过程没有聚合怎么办?当然那么返回的数据真的可以是 table 中数据的“指针”,而不是副本?。是的,原则上这可能是真的。但想想这意味着什么。当您查看结果时,其他人是否可以更改 table 中的基础数据?你们可以同时更改吗?谁决定如何解决这个问题 - SQL 引擎?其他人可以在您编辑数据时删除 table 吗?等等等等。

考虑 SQL 服务器(或任何“真正的”数据库引擎)的方式是错误的。您看到的作为 select 结果的数据是从 table 中读取的,并作为您自己的个人副本通过网络发送到客户端。它不再连接到它来自的 table。

哦...如果您想知道如何在 MS Access 中使用链接的 tables 时“直接在 tables 中”编辑数据:您还是不行Access 会在幕后为您做一些工作。为了证明这一点,尝试将 SQL 服务器 table 链接到 MS Access,然后拉出访问中的行,并开始编辑它。然后,在完成编辑之前,进入 SSMS 并在访问中更新您正在编辑的行。然后尝试在 Access 中保存您的更改。