Tengo una base de datos SQL Server 2005. En algunos procedimientos, tengo parámetros de tabla que paso a un proceso almacenado como un nvarchar
(separados por comas) y los divido internamente en valores únicos. Lo agrego a la lista de parámetros del comando SQL de esta manera:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Tengo que migrar la base de datos a SQL Server 2008. Sé que hay parámetros de valores de tabla y sé cómo usarlos en procedimientos almacenados. Pero no sé cómo pasar uno a la lista de parámetros en un comando SQL.
¿Alguien sabe la sintaxis correcta del Parameters.Add
procedimiento? ¿O hay otra forma de pasar este parámetro?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Marek Kwiendacz
fuente
fuente
Respuestas:
DataTable
,DbDataReader
uIEnumerable<SqlDataRecord>
objetos se pueden usar para completar un parámetro con valores de tabla según el artículo de MSDN Parámetros con valores de tabla en SQL Server 2008 (ADO.NET) .El siguiente ejemplo ilustra el uso de a
DataTable
o anIEnumerable<SqlDataRecord>
:Código SQL :
Código C # :
fuente
DataTable
valor de parámetro, establecidoSqlDbType
enStructured
yTypeName
para el nombre UDT de la base de datos.null
.CreateSqlDataRecords
nunca volveránull
si se le da unids
parámetro vacío .DataTable
(oDataSet
) solo lo implementan porque tienen que surtir capacidades de arrastrar y soltar en Visual-Studio, por lo que implementanIComponent
qué implementosIDisposable
. Si no usa el diseñador pero lo crea manualmente, no hay razón para deshacerse de él (o para usar lausing
declaración). Así que esta es una de las excepciones de la regla de oro "disponer todo lo que implementeIDisposable
".Dispose
métodos, incluso si es solo para que Code Analysis no me avise si no lo hago. Pero estoy de acuerdo en que en este escenario específico donde se usan la baseDataSet
y lasDataTable
instancias, llamarDispose
no haría nada.Con la respuesta de Ryan que también tendrá que establecer el
DataColumn
'sOrdinal
propiedad si se trata de unatable-valued parameter
con múltiples columnas cuyos ordinales son no en orden alfabético.Como ejemplo, si tiene el siguiente valor de tabla que se utiliza como parámetro en SQL:
Debería ordenar sus columnas como tales en C #:
Si no lo hace, obtendrá un error de análisis, no se pudo convertir nvarchar a int.
fuente
Genérico
fuente
La forma más limpia de trabajar con él. Suponiendo que su tabla es una lista de enteros llamada "dbo.tvp_Int" (Personalizar para su propio tipo de tabla)
Cree este método de extensión ...
Ahora puede agregar un parámetro con valores de tabla en una línea en cualquier lugar simplemente haciendo esto:
fuente
if(paramCollection != null)
cheque simple en la parte superior del método estará bienIEnumerable
lugar deList
en la firma, de esa manera puede pasar cualquier cosa que seaIEnumerable
, no solo listas, ya que no está usando ninguna función específica paraList
, realmente no veo una razón para no hacerlo nosotrosIEnumerable
Use este código para crear parámetros adecuados a partir de su tipo:
fuente