SQL更新可选参数PHP

Zak*_*ias 7 php sql t-sql sql-server stored-procedures

我们想要改变将值从PHP传递到存储过程(T-SQL)的方式.我只有很少的PHP经验,但我会尝试通过与我们的Web开发人员的讨论来解释这个过程.

当前流程

示例测试表

测试表

为了更新记录,例如本例中的Field3,我们将所有现有值传递回存储过程.

EXEC dbo.UpdateTest @ID = 1, @Field1 = 'ABC', @Field2 = 'DEF', @Field3 = 'GHI', @Field4 = 'JKL'
Run Code Online (Sandbox Code Playgroud)

让我们说更新Field3,你必须单击一个按钮.这将导航到一个新页面,该页面将运行存储过程以更新数据.由于新页面不知道值,因此必须运行一个SELECT过程以在运行之前检索值UPDATE.

然后,该脚本将用户重定向回重新加载更新数据的页面,并且更改将反映在屏幕上.

新进程

我们想要做的只是传递我们想要改变的字段.

EXEC dbo.UpdateTest @ID = 1, @Field2 = 'DEF', @Field3 = 'GHI'
Run Code Online (Sandbox Code Playgroud)

我们的解决方案很简单 首先,我们将所有可更新字段设置为可选(因此NULL可以传递).然后我们检查参数是否NULL(未通过),如果是,那么我们忽略它,如果不是,我们更新它.

UPDATE 
    dbo.Test
SET
    Field1 = NULLIF(ISNULL(@Field1,Field1),'-999')
    ,Field2 = NULLIF(ISNULL(@Field2,Field2),'-999')
    ,Field3 = NULLIF(ISNULL(@Field3,Field3),'-999')
    ,Field4 = NULLIF(ISNULL(@Field4,Field4),'-999')
WHERE
    ID = @ID
Run Code Online (Sandbox Code Playgroud)

但是,我们仍然希望程序来更新数据库记录NULL,如果一个NULL通过.解决方法是将任意值分配给相等NULL(在本例中为-999),以便在NULL传递任意值(-999)时更新过程.

这个解决方案相当混乱,在我看来,这是一种解决问题的低效方法.还有更好的解决方案吗?我们做错了什么?

非常感谢任何回复

M T*_*ead 0

EXEC dbo.UpdateTest @ID = 1, @Field1 = 'ABC', @Field2 = 'DEF', @Field3 = 'GHI', @Field4 = 'JKL'
Run Code Online (Sandbox Code Playgroud)

EXEC dbo.UpdateTest @ID = 1, @Field2 = 'DEF', @Field3 = 'GHI'
Run Code Online (Sandbox Code Playgroud)

都是通过 MsSql 或 Sybase 使用相同存储过程的有效方法。当您不发送值时,与发送 null 相同。除非你在存储过程中设置了默认值。在这种情况下,将使用默认值而不是 null。