MS SQL 2008 prend en charge TVP: une fonctionnalité utile pour le téléchargement en masse de données vers une procédure stockée pour traitement.
Plutôt que de créer un type défini par l'utilisateur, est-il possible de tirer parti d'une définition de table existante? Par exemple, est-il possible de créer une procédure stockée avec la signature suivante?
CREATE PROCEDURE usp_InsertProductionLocation
@TVP **LocationTable** READONLY
La documentation semble suggérer que ce n'est pas possible.
EXEMPLE DE CODE
/*
Sample code from:
http://msdn.microsoft.com/en-us/library/bb510489.aspx
*/
USE AdventureWorks2008R2;
GO
/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT );
GO
/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
@TVP LocationTableType READONLY
AS
SET NOCOUNT ON
INSERT INTO [AdventureWorks2008R2].[Production].[Location]
([Name]
,[CostRate]
,[Availability]
,[ModifiedDate])
SELECT *, 0, GETDATE()
FROM @TVP;
GO
/* Declare a variable that references the type. */
DECLARE @LocationTVP
AS LocationTableType;
/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
SELECT [Name], 0.00
FROM
[AdventureWorks2008R2].[Person].[StateProvince];
/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
/*
The following is not part of the original source code:
*/
CREATE TABLE LocationTable(
LocationName VARCHAR(50)
, CostRate INT );
GO
la source
Erland Sommarskog a un article complet décrivant comment utiliser TVP.
Jetez un oeil, ça vaut le coup!
En bref, vous ne pouvez pas utiliser un type existant, tout comme la réponse précédente d'Aaron Bertrand . Mais au moins c'est un transfert en masse ..
la source
Basé sur la réponse de Jiten, simplifiant une partie de la logique par endroits, tenant compte des
identity
colonnes (en utilisant dessys.
tables plutôt queSCHEMEA
)la source