Passar o parâmetro com valor de tabela usando o ADO.Net

Como passar o parâmetro com valor de tabela para o procedimento armazenado usando o ADO.Net?

  1. Criar tipo no SQL Server :

    CREATE TYPE [dbo].[MyDataType] As Table ( ID INT, Name NVARCHAR(50) ) 
  2. Criar Procedimento :

     CREATE PROCEDURE [dbo].[MyProcedure] ( @myData As [dbo].[MyDataType] Readonly ) AS BEGIN SELECT * FROM @myData END 
  3. Criar DataTable em C # :

     DataTable myDataTable = new DataTable("MyDataType"); myDataTable.Columns.Add("Name", typeof(string)); myDataTable.Columns.Add("Id", typeof(Int32)); myDataTable.Rows.Add("XYZ", 1); myDataTable.Rows.Add("ABC", 2); 
  4. Criar Parâmetro SQL :

     SqlParameter parameter = new SqlParameter(); parameter.ParameterName = "@myData"; parameter.SqlDbType = System.Data.SqlDbType.Structured; parameter.Value = myDataTable; command.Parameters.Add(parameter); 

Eu tentei isso e recebi a exceção:

O parâmetro de tipo de tabela ‘@MyDataType’ deve ter um nome de tipo válido.

Eu tive que definir a propriedade “TypeName” do SqlParameter:

 parameter.TypeName = "MyDataType"; 

Esta questão é uma duplicata de Como passar parâmetros de valor da tabela para o procedimento armazenado do código .net . Por favor, consulte essa pergunta para um exemplo ilustrando o uso de um DataTable ou um IEnumerable .

Você pode prefixar com Exec

 using( SqlConnection con = new SqlConnection( "Server=.;database=employee;user=sa;password=12345" ) ) { SqlCommand cmd = new SqlCommand( " exec ('drop table '+@tab)" , con ); cmd.Parameters.AddWithValue( "@tab" ,"Employee" ); con.Open( ); cmd.ExecuteNonQuery( ); }