这是一个有关在使用.NET的SQL Server 2008存储过程中如何使用表值参数的示例。

这是CF9中参数类型的列表。

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

#1 楼

不确定。

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

此处的代码示例。

#2 楼

简短的答案:不支持,应该投票!

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

XML可以使用,但是使用TVP可以使客户端代码和proc代码更易于阅读,编写,检查和调试。在大多数情况下,取决于API的实现,它也更快。

FYI,使用Oracle并没有更好的选择。它们具有ARRAY SQL数据类型(最接近TVP)。 JDBC也不支持它:使用数组对象

#3 楼

我发现了这种解决方法。您可以从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语句。

–菲利普·森(Phillip Senn)
13-10-23在20:19

仅当您的存储过程使用返回值时才需要返回值,该返回值有时用于错误检查并在sproc无法运行时返回消息。看看cfstoredproc的returncode = true

–加里·希克斯(Gary Hiscox)
2014年2月12日在20:21

#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参数中的数据插入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