从存储过程中的参数表中提取参数?
Posted
技术标签:
【中文标题】从存储过程中的参数表中提取参数?【英文标题】:Extract parameters from a table of parameters in a stored procedure? 【发布时间】:2016-02-19 16:30:45 【问题描述】:我定义了下一个数据类型:
CREATE TYPE dbo.FieldsTable AS TABLE
(
[Name] nvarchar(255),
[Value] nvarchar(255)
)
我想用这个符号声明一个存储过程:
CREATE PROCEDURE dbo.uspSaveEntity
(
@Id int,
@Fields [FieldsTable] readonly
)
AS
...
此过程应该接收一个 FieldsTable 类型,其中包含我需要在实体的 UPDATE 中设置的字段和值的列表。
例如,要调用我想做的程序,例如:
DECLARE @entityFields FieldsTable;
INSERT INTO @entityFields VALUES ('FirstName', 'John');
INSERT INTO @entityFields VALUES ('LastName', 'Doe');
EXEC uspSaveEntity 1500, @entityFields
问题是:如何从收到的表格中提取参数?
直到现在我还在想这样的事情:
SET @FirstName = (SELECT Value FROM @Fields WHERE Name = 'FirstName');
SET @LastName = (SELECT Value FROM @Fields WHERE Name = 'LastName');
...
UPDATE tblEntity SET FirstName = @FirstName ...
我认为对每个字段使用 SET 和 SELECT 可能代码太多......是否存在一些更清楚的方法来做到这一点?
UPDATE 查询和所有存储过程不需要是动态的,但需要支持有这种特殊的方式来接收参数。
【问题讨论】:
【参考方案1】:个别set
的陈述是相当合理的。另一种方法是枢轴或条件聚合:
select @FirstName = max(case when Name = 'FirstName' then Value end),
@LastName = max(case when Name = 'LastName' then Value end),
. . .
from @Fields;
【讨论】:
我喜欢你建议的这种方式,我想这样做:SELECT @ FirstName = COALESCE(MAX(CASE WHEN Name = 'FirstName' THEN Value END), 'Default'), @ LastName = COALESCE(MAX(CASE WHEN Name = 'LastName' THEN Value END), 'Default') FROM @ Fields 要具有默认值。谢谢!【参考方案2】:您拥有的表是本地表,我怀疑行数很少。因此,从性能角度来看,每个解决方案都是相同的。在这种情况下,我更喜欢更具可读性的解决方案。可以直接在select中选择变量中的值,而不需要使用set语句:
SELECT @FirstName = Value FROM @Fields WHERE Name = 'FirstName';
【讨论】:
以上是关于从存储过程中的参数表中提取参数?的主要内容,如果未能解决你的问题,请参考以下文章