Estoy llamando a un procedimiento almacenado de SQL Server desde mi código C #:
using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("InsertQuerySPROC", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
var STableParameter = cmd.Parameters.AddWithValue("@QueryTable", QueryTable);
var NDistanceParameter = cmd.Parameters.AddWithValue("@NDistanceThreshold", NDistanceThreshold);
var RDistanceParameter = cmd.Parameters.AddWithValue(@"RDistanceThreshold", RDistanceThreshold);
STableParameter .SqlDbType = SqlDbType.Structured;
NDistanceParameter.SqlDbType = SqlDbType.Int;
RDistanceParameter.SqlDbType = SqlDbType.Int;
// Execute the query
SqlDataReader QueryReader = cmd.ExecuteReader();
Mi proceso almacenado es bastante estándar pero se une con QueryTable
(de ahí la necesidad de usar un proceso almacenado).
Ahora: quiero agregar una lista de cadenas List<string>
, al conjunto de parámetros. Por ejemplo, mi consulta proc almacenada es así:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Sin embargo, la lista de cadenas es dinámica y tiene unos cientos de longitud.
¿Hay alguna forma de pasar una lista de cadenas List<string>
al proceso almacenado? ¿O hay una mejor manera de hacer esto?
Muchas gracias, Brett
c#
sql
stored-procedures
Brett
fuente
fuente
using
bloque.Respuestas:
Si está utilizando SQL Server 2008, hay una nueva función llamada Tipo de tabla definida por el usuario. A continuación, se muestra un ejemplo de cómo utilizarlo:
Cree su tipo de tabla definido por el usuario:
A continuación, debe usarlo correctamente en su procedimiento almacenado:
Finalmente, aquí hay algo de sql para usarlo en c #:
Para ejecutar esto desde SSMS
fuente
El patrón típico en esta situación es pasar los elementos en una lista delimitada por comas, y luego en SQL dividirlos en una tabla que puede usar. La mayoría de las personas suelen crear una función específica para hacer esto como:
Y luego puedes usarlo en otras consultas.
fuente
No, las matrices / listas no se pueden pasar directamente a SQL Server.
Las siguientes opciones están disponibles:
fuente
Sí, establezca el parámetro Stored proc como
VARCHAR(...)
Y luego pase valores separados por comas a un procedimiento almacenado.Si está utilizando Sql Server 2008, puede aprovechar TVP ( Parámetros de valor de tabla ): SQL 2008 TVP y LINQ si la estructura de QueryTable es más compleja que la matriz de cadenas, de lo contrario sería una exageración porque requiere que se cree el tipo de tabla dentro de SQl Server
fuente
Cree una tabla de datos con una columna en lugar de List y agregue cadenas a la tabla. Puede pasar esta tabla de datos como tipo estructurado y realizar otra combinación con el campo de título de su tabla.
fuente
Si prefiere dividir una lista CSV en SQL, hay una forma diferente de hacerlo utilizando Expresiones de tabla comunes (CTE). Consulte Forma eficiente de dividir cadenas mediante CTE .
fuente
La única forma que conozco es crear una lista CSV y luego pasarla como cadena. Luego, en el lado SP, simplemente divídalo y haga lo que necesite.
fuente
cree un TIPO como tabla y asígnele el nombre "StringList1"
Cree un procedimiento como el anterior y asígnele el nombre "UserStringList1" s
en c #, prueba esto
fuente