从存储过程中的参数表中提取参数?

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';

【讨论】:

以上是关于从存储过程中的参数表中提取参数?的主要内容,如果未能解决你的问题,请参考以下文章

从java中的mysql存储过程中获取参数

如何从 SQL Server 中的存储过程中检索参数列表

如何从存储过程的表中的列中获取输出参数

从 C# 执行 Oracle 存储过程 - 调用中的参数数量或类型错误

SQL Server 存储过程中的可选参数?

通过将表名作为参数传递,使用 oracle 中的存储过程从表中搜索数据