以下是如何在使用.NET的SQL Server 2008存储过程中使用表值参数的example。
这是parameter types in CF9的列表。
问:ColdFusion是否可以将表值参数传递给Microsoft SQL Server 2008存储过程?
答案 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)
答案 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