【问题标题】:Implementing Table Value Parameters in Stored Procedures for SQL Server在 SQL Server 的存储过程中实现表值参数
【发布时间】:2018-03-06 18:36:58
【问题描述】:

我很难理解作为存储过程的输入参数所需的表值参数的实现。我需要根据以下要求创建一个存储过程:

https://imgur.com/a/O5iQL

它明确指出我需要创建一个名为usp_createPackage 的存储过程,并带有输入和输出参数。在此之前,我已经在下面创建了这些存储过程所需的表:

CREATE TABLE ServicePackage
(
    servicePackageID    VARCHAR (10) NOT NULL,
    name                VARCHAR (50) NOT NULL,
    description         VARCHAR (50),
    startDate           DATE NOT NULL,
    endDate             DATE ,
    advertisePrice      DECIMAL (6,2) NOT NULL,
    inclusion           VARCHAR (50) NOT NULL,
    exclusion           VARCHAR (50) NOT NULL,
    status              VARCHAR (50) NOT NULL,
    serviceID           VARCHAR (10) NOT NULL,
    staffID             VARCHAR (10) NOT NULL,

    PRIMARY KEY(servicePackageID),
    FOREIGN KEY (serviceID) 
         REFERENCES ServiceItem (serviceID)
              ON UPDATE CASCADE ON DELETE NO ACTION,                                                  
    FOREIGN KEY (staffID) 
         REFERENCES Staff (staffID)
              ON UPDATE CASCADE ON DELETE NO ACTION,
);

服务项目表(用于需要TPV的第二个输入参数),创建了下表和代码:

CREATE TABLE ServiceItemInPackage
(
    serviceID           VARCHAR (10) NOT NULL,
    servicePackageID    VARCHAR (10) NOT NULL,
    qty                 INT NOT NULL, 

    PRIMARY KEY (serviceID, servicePackageID),
    FOREIGN KEY (serviceID) 
         REFERENCES ServiceItem (serviceID)
              ON UPDATE CASCADE ON DELETE NO ACTION,                                                   
    FOREIGN KEY (servicePackageID) 
         REFERENCES ServicePackage (servicePackageID)
);

到目前为止,我正在创建的存储过程缺少需要 TPV 的第二个参数,并且我还没有实现开始后发生的事情:

CREATE PROCEDURE usp_createPackage
    @name VARCHAR(50),
    @description VARCHAR(50),
    @startDate DATE,
    @endDate DATE,
    @advertisePrice DECIMAL (6,2),
    @staffID VARCHAR(10),
    @servicePackageID VARCHAR(10) OUTPUT
AS
BEGIN

请问,如何创建一个包含 TPV 的存储过程,以及在 imgur 中实现目标我缺少什么?

【问题讨论】:

  • 您还记得讲师谈到创建和使用用户定义的类型吗?这是您需要使用的。您将类型创建为具有多个列的表。除了为您完成整个任务之外,没有太多要添加的内容。 google.com/…
  • 我会注意的。
  • 阅读documentation,其中包含一个示例。您不创建表,而是创建用户定义的表type。

标签: sql-server stored-procedures


【解决方案1】:

您需要创建一个用户定义的表类型,它代表您要传递给存储过程的表。一旦定义了类型,您就可以将该类型用于存储过程参数。 Microsoft 在这方面的文档是一个好的开始。

【讨论】:

  • 我很抱歉成为用户定义表类型的新手。我从阅读中了解到,它允许将 2 个或多个参数包含在一个中。用户定义的表类型对于将第二个输入参数添加到 CREATE PROCEDURE 中是否有用?
  • 对不起,我没有解释清楚:您使用表值参数是正确的。要使用 TVP,第一步是创建一个用户定义的表类型,以便指定将通过参数传入的表。见:link
  • 明白。我将研究它,看看 TPV 将如何帮助实现我的目标。主要共识是我必须创建一个表类型,而不是表。表类型值是否等同于表值,或者名称可以不同?
  • 表类型值可以是任何值;您需要声明该类型的变量,将数据插入该表,然后将变量传递给存储的过程。类型列不一定要匹配任何物理表列。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多