【发布时间】:2016-12-21 12:37:31
【问题描述】:
我们想要改变将值从 PHP 传递到存储过程 (T-SQL) 的方式。我只有少量 PHP 经验,但我将尝试通过与我们的 Web 开发人员的讨论来解释该过程。
当前进程
示例测试表
为了更新记录,例如本例中的 Field3,我们会将所有现有值传递回存储过程。
EXEC dbo.UpdateTest @ID = 1, @Field1 = 'ABC', @Field2 = 'DEF', @Field3 = 'GHI', @Field4 = 'JKL'
假设要更新 Field3,您必须单击一个按钮。这将导航到一个新页面,该页面将运行存储过程来更新数据。由于新页面不知道值,它必须运行SELECT 过程以在运行UPDATE 之前检索值。
然后,该脚本会将用户重定向回重新加载更新数据的页面,并且更改会反映在屏幕上。
新流程
我们想做的只是传递我们想要更改的字段。
EXEC dbo.UpdateTest @ID = 1, @Field2 = 'DEF', @Field3 = 'GHI'
我们的解决方案很简单。首先,我们将所有可更新字段设置为可选(因此可以传递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
但是,如果NULL 值被传递,我们仍然希望过程将数据库记录更新为NULL。解决方法是分配一个等于NULL 的任意值(在本例中为-999),这样如果传递了任意值(-999),该过程将更新NULL。
这个解决方案相当混乱,在我看来,这是一种低效的解决问题的方法。有没有更好的解决方案?我们做错了什么?
非常感谢任何回复
【问题讨论】:
-
不确定我是否遵循了这个问题。但是由于您在执行存储过程时传递了命名参数。 EXEC dbo.UpdateTest ID = 1, Field2 = 'DEF', Field3 = 'GHI' 您正在向所有其他字段发送空值。您无需执行任何操作,该值将为空。我不会传递 -999 的值,因为我认为不需要它。你在数据库中写的是什么,null 还是 -999?
-
您的“我们想通过什么”这行没有任何问题。如果你在 MsSql 服务器上,不同的 Sql 平台工作方式不同。
-
我在答案部分发帖是因为使用了@符号,如果我把它们放在 cmets 部分,它会试图阻止我。
-
您能否将参数包装在
XML中并将其传递给程序。 SQL Server 可以解析 XML,因此它允许传递和解析任何参数组合。也许有趣? stackoverflow.com/questions/15128999/…。另外:itworld.com/article/2960645/development/…。并且:simple-talk.com/blogs/…
标签: php sql sql-server tsql stored-procedures