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)时更新过程.
这个解决方案相当混乱,在我看来,这是一种解决问题的低效方法.还有更好的解决方案吗?我们做错了什么?
非常感谢任何回复
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。