2010-04-21 3 views
4

Ниже приведено описание использования табличных параметров в хранимой процедуре SQL Server 2008 с использованием .NET. example.Передача таблицы Значения параметра в хранимую процедуру

И вот список parameter types in CF9.

В: Возможно ли, чтобы ColdFusion передал параметр таблицы в хранимую процедуру Microsoft SQL Server 2008?

ответ

2

Не уверен.

Если вам нужно передать таблицу информации, вероятно, лучше всего использовать тип данных XML.

Образец образца here.

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 Table.

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 
7

Короткий ответ: никакой поддержки, он должен голосовать за это!

Long Answer: Coldfusion может использовать JDBC, который еще не поддерживает TVP, но он должен. Проголосуйте за эту функцию здесь: http://mssqlconn.uservoice.com/forums/113295-feature-feedback/suggestions/2269687-table-valued-parameters-tvp-support-in-jdbc

XML будет работать, но использование TVP делает код клиента и sproc более легким для чтения, записи, просмотра и отладки. В большинстве случаев это происходит быстрее, в зависимости от реализации API.

FYI, используя Oracle, не лучше. Они имеют тип данных ARRAY SQL (который ближе всего к TVP). Он также не поддерживается JDBC: Using Array Objects

4

Я обнаружил это обходное решение. Вы можете вызвать хранимую процедуру из 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> 
+0

Wow user2906092, это интересно. Это обходной путь. Теперь я не понимаю выражение «return value» = @ return_value. –

+0

Возвращаемое значение требуется только в том случае, если ваша хранимая процедура использует возвращаемое значение, которое иногда используется для проверки ошибок и возврата сообщения, если sproc не запускается. Посмотрите на returncode = true для [cfstoredproc] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7d55.html) –

Смежные вопросы