2010-04-21 3 views

Répondre

2

Incertain.

Si vous devez passer une table d'information, il est probablement préférable d'utiliser le type de données XML.

Échantillon de code here.

2

Je pense la même chose que vous avez besoin de type de données XML pour le faire. Je donne un exemple ici. ##

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

Maintenant, créons une procédure stockée qui renvoie deux ensembles de résultats. Laissez-nous créer la procédure stockée suivante qui accepte un paramètre XML. Cette procédure insérera les données du paramètre XML dans la table des employés.

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

Réponse courte: Pas de support, ça devrait, votez pour!

Réponse longue: Coldfusion peut utiliser JDBC, qui ne supporte pas encore les TVP, mais il le devrait. Votez pour la fonctionnalité ici: http://mssqlconn.uservoice.com/forums/113295-feature-feedback/suggestions/2269687-table-valued-parameters-tvp-support-in-jdbc

XML fonctionnera, mais l'utilisation de TVP facilite la lecture, l'écriture, la révision et le débogage du code client et du code sproc. Il est également plus rapide dans la plupart des cas en fonction de la mise en œuvre de l'API.

FYI, en utilisant Oracle n'est pas mieux. Ils ont le type de données ARRAY SQL (qui est le plus proche de TVP). Il n'est pas non plus supporté par JDBC: Using Array Objects

4

J'ai découvert cette solution de contournement. Vous pouvez appeler une procédure stockée à partir d'une requête cfpery, de cette façon vous pouvez transmettre un paramètre TVP de valeur Table.

<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, c'est intéressant. C'est une solution de contournement. Maintenant, je ne comprends pas l'instruction select 'return value' = @ return_value. –

+0

La valeur de retour est uniquement requise si votre procédure stockée utilise une valeur de retour, parfois utilisée pour la vérification des erreurs et renvoyant un message si le sproc ne peut pas être exécuté. Jetez un oeil à returncode = true pour [cfstoredproc] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7d55.html) –

Questions connexes