将Table Valued参数传递给存储过程

时间:2010-04-21 14:35:19

标签: sql-server-2008 coldfusion

以下是如何在使用.NET的SQL Server 2008存储过程中使用表值参数的example

这是parameter types in CF9的列表。

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

4 个答案:

答案 0 :(得分:7)

简答:没有支持,它应该投票给它!

长答案: 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

答案 1 :(得分:4)

我发现了这个解决方法。您可以在cfquery中调用存储过程,这样您就可以传入Table值参数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>

答案 2 :(得分:2)

不确定。

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

代码示例here

答案 3 :(得分:2)

我认为您需要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参数中的数据插入Employee表。

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