我定义了下一个数据类型:
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查询和所有存储过程不需要是动态的,但需要支持这种特殊方式来接收参数。
答案 0 :(得分:1)
单个set
陈述非常合理。另一种选择是枢轴或条件聚合:
select @FirstName = max(case when Name = 'FirstName' then Value end),
@LastName = max(case when Name = 'LastName' then Value end),
. . .
from @Fields;
答案 1 :(得分:0)
你拥有的表是一个本地表和行数,我怀疑是非常少的。因此从性能角度来看,每个解决方案都是相同我更喜欢在这种情况下更具可读性的解决方案。您可以直接在select中选择变量中的值而不使用set语句:
SELECT @FirstName = Value FROM @Fields WHERE Name = 'FirstName';