Eu tenho um banco de dados SQL Server 2005. Em alguns procedimentos, tenho parâmetros de tabela que passo para um processo armazenado nvarchar
(separado por vírgulas) e divido internamente em valores únicos. Eu o adiciono à lista de parâmetros de comando SQL como esta:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Eu tenho que migrar o banco de dados para o SQL Server 2008. Sei que existem parâmetros de valor de tabela e sei como usá-los em procedimentos armazenados. Mas não sei como passar um para a lista de parâmetros em um comando SQL.
Alguém sabe a sintaxe correta do Parameters.Add
procedimento? Ou existe outra maneira de passar esse parâmetro?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Marek Kwiendacz
fonte
fonte
Respostas:
DataTable
,DbDataReader
, OuIEnumerable<SqlDataRecord>
objetos podem ser usados para preencher um parâmetro com valor de tabela pelo artigo do MSDN Parâmetros com valor de tabela no SQL Server 2008 (ADO.NET) .O exemplo a seguir ilustra o uso de um
DataTable
ou umIEnumerable<SqlDataRecord>
:Código SQL :
Código C # :
fonte
DataTable
como o valor do parâmetro, definaSqlDbType
paraStructured
eTypeName
para o nome UDT do banco de dados.null
.CreateSqlDataRecords
nunca retornaránull
se for dado umids
parâmetro vazio .DataTable
(ouDataSet
) implementa-o apenas porque eles têm que suprimir recursos de arrastar e soltar no Visual-Studio, para que implementemIComponent
quais implementosIDisposable
. Se você não usar o designer, mas criá-lo manualmente, não há motivo para descartá-lo (ou usar ausing
declaração). Portanto, essa é uma das exceções da regra de ouro "descarte tudo o que implementaIDisposable
".Dispose
métodos, mesmo que seja apenas para que a Análise de Código não me avise se não o fizer. Mas concordo que nesse cenário específico em que baseDataSet
eDataTable
instâncias são usadas, a chamadaDispose
não faria nada.Na sequência da resposta de Ryan você também precisará definir o
DataColumn
'sOrdinal
propriedade, se você está lidando com umtable-valued parameter
com múltiplas colunas cujos ordinais são não em ordem alfabética.Como exemplo, se você tiver o seguinte valor de tabela usado como parâmetro no SQL:
Você precisaria ordenar suas colunas como tal em C #:
Se você não conseguir fazer isso, receberá um erro de análise, falha ao converter nvarchar em int.
fonte
Genérico
fonte
A maneira mais limpa de trabalhar com isso. Supondo que sua tabela seja uma lista de números inteiros chamada "dbo.tvp_Int" (personalize para seu próprio tipo de tabela)
Crie este método de extensão ...
Agora você pode adicionar um parâmetro com valor de tabela em uma linha em qualquer lugar, simplesmente fazendo o seguinte:
fonte
if(paramCollection != null)
seleção no topo do método vai ficar bemIEnumerable
vez daList
assinatura, para que você possa passar qualquer coisa que sejaIEnumerable
, não apenas listas. Como você não está usando nenhuma função específicaList
, não vejo realmente um motivo para não nósIEnumerable
Use este código para criar um parâmetro adequado do seu tipo:
fonte