O MS SQL 2008 oferece suporte a TVP: um recurso útil para upload de dados em massa para um procedimento armazenado para processamento.
Em vez de criar um tipo definido pelo usuário, é possível aproveitar uma definição de tabela existente? Por exemplo, é possível criar um procedimento armazenado com a seguinte assinatura?
CREATE PROCEDURE usp_InsertProductionLocation
@TVP **LocationTable** READONLY
A documentação parece sugerir que isso não é possível.
CÓDIGO DE AMOSTRA
/*
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
Não, você não pode aproveitar uma definição de tabela existente, você precisa definir um tipo explícito. Isso foi solicitado em 2007 e foi fechado como "não vai consertar", mas ainda o encorajo fortemente a votar e deixar um comentário descrevendo seu caso de uso e como isso ajudará sua empresa a ser mais produtiva. Você pode até apontar para esta questão para demonstrar como pode ser tedioso tentar automatizar isso.
Você pode fazer isso hoje, dinamicamente, no entanto... por exemplo, para sua definição simples:
Resultados:
Isenção de responsabilidade: isso não lida com todos os tipos de outras coisas, como tipos MAX, precisão e escala para números etc.
No SQL Server 2012, há novos DMVs e procedimentos armazenados que tornarão muito mais fácil derivar metadados de colunas de tabelas existentes (ou procedimentos armazenados ou até mesmo consultas ad hoc) sem ter que mexer com toda a lógica condicional contra sys.types e sys. colunas. Fiz um breve blog sobre essas melhorias em dezembro . Ainda é tedioso, mas está em algum lugar entre o terrível espaguete insustentável acima e a capacidade de apenas dizer "como cópia da [tabela x]"...
Lidei com esse problema criando o seguinte procedimento armazenado para criar um tipo com o mesmo esquema que a tabela existente pode ter.
você pode usar assim
Exec Sp_DefineTypeOutOfTableSchema 'Table1name,Table2name'
Erland Sommarskog tem um extenso artigo descrevendo como usar o TVP.
Dê uma olhada, vale a pena!
Resumindo, você não pode usar um tipo existente, assim como a resposta anterior de Aaron Bertrand . Mas pelo menos é uma transferência em massa.