将表值参数传递给存储过程

Posted

技术标签:

【中文标题】将表值参数传递给存储过程【英文标题】:Passing a Table Valued parameter to a stored procedure 【发布时间】:2010-04-21 14:35:19 【问题描述】:

这是一个example,介绍了如何在使用 .NET 的 SQL Server 2008 存储过程中使用表值参数。

这是parameter types in CF9的列表。

问:ColdFusion 是否可以将表值参数传递给 Microsoft SQL Server 2008 存储过程?

【问题讨论】:

【参考方案1】:

简答:不支持,应该,投给它!

长答案: Coldfusion 可以使用 JDBC,它还不支持 TVP,但应该支持。在此处为该功能投票: http://mssqlconn.uservoice.com/forums/113295-feature-feedback/suggestions/2269687-table-valued-parameters-tvp-support-in-jdbc

XML 可以工作,但使用 TVP 可以使客户端和 sproc 代码更易于阅读、编写、审查和调试。在大多数情况下,它也会更快,具体取决于 API 的实现。

仅供参考,使用 Oracle 也好不到哪里去。它们具有 ARRAY SQL 数据类型(最接近 TVP)。 JDBC也不支持:Using Array Objects

【讨论】:

【参考方案2】:

我发现了这个解决方法。您可以在 cfquery 中调用存储过程,这样您就可以传入一个表值参数 TVP。

<cfquery datasource="" name="">
     DECLARE        @return_value int

     -- Create table value parameter
     DECLARE @DataTVP tDataTable;

     --Build Table
     INSERT INTO @DataTVP(DataId)
     VALUES (1),(2),(3)

     EXEC        @return_value = P_DeleteItems
                 @tvpData = @DataTVP --Pass table into Stored Procedure

     SELECT        'Return Value' = @return_value 
</cfquery>

【讨论】:

哇 user2906092,这很有趣。这是一种解决方法。现在,我不明白 select 'return value'=@return_value 语句。 只有当您的存储过程使用返回值时才需要返回值,有时用于错误检查并在存储过程无法运行时返回消息。查看cfstoredproc的 returncode = true@【参考方案3】:

不确定。

如果您需要传递信息表,最好的办法可能是使用 XML 数据类型。

代码示例here。

【讨论】:

【参考方案4】:

我认为您需要 XML 数据类型来执行此操作。我在这里提供一个例子。 ##

-- Create a Database
CREATE DATABASE DataTableTest
USE DataTableTest
GO

--Create the sample tables
CREATE TABLE Employees (
    EmployeeID BIGINT IDENTITY(1,1),
    EmployeeName VARCHAR(50),
    DepartmentID BIGINT )

CREATE TABLE Departments (
    DepartmentID BIGINT IDENTITY(1,1),
    DepartmentName VARCHAR(50) )

GO

-- Populate the Sample Tables
INSERT INTO Departments ( DepartmentName)
SELECT 'IT'

INSERT INTO Employees (EmployeeName, DepartmentID )
SELECT 'JCB', 1
GO

现在让我们创建一个返回两个结果集的存储过程。

CREATE PROCEDURE GetEmployeeInfo
AS
SET NOCOUNT ON  

  SELECT EmployeeName, DepartmentID
    FROM Employees
    WHERE EmployeeID = 1

    SELECT DepartmentName FROM Departments
    WHERE DepartmentID = 1
    GO

让我们创建下一个接受 XML 参数的存储过程。此过程会将 XML 参数中的数据插入到员工表中。

CREATE PROCEDURE ProcessXml
(
    @data XML
)
AS

INSERT INTO Employees(EmployeeName, DepartmentID)
SELECT
    x.d.value('EmployeeName[1]','VARCHAR(50)') AS EmployeeName,
    x.d.value('DepartmentID[1]','INT') AS DepartmentID
FROM @data.nodes('/NewDataSet/Table') x(d)

GO

【讨论】:

以上是关于将表值参数传递给存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何从.net代码将表值参数传递给存储过程

将表值参数传递给具有不同字段数的存储过程

如何使用 C# 和 SQL 将表值参数传递给用户定义的数据表

将表名作为参数传递给存储过程

如何将表名作为参数传递给存储过程?

SQL Server存储过程中使用表值作为输入参数示例