Estou chamando um procedimento armazenado do SQL Server do meu 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();
Meu proc armazenado é bastante padrão, mas faz uma junção com QueryTable
(daí a necessidade de usar um proc armazenado).
Agora: desejo adicionar uma lista de strings,, List<string>
ao conjunto de parâmetros. Por exemplo, minha consulta proc armazenada é assim:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
No entanto, a lista de strings é dinâmica e com algumas centenas de comprimento.
Existe uma maneira de passar uma lista de strings List<string>
para o procedimento armazenado ?? Ou há uma maneira melhor de fazer isto?
Muito obrigado, brett
c#
sql
stored-procedures
Brett
fonte
fonte
using
bloco.Respostas:
Se você estiver usando o SQL Server 2008, há um novo recurso chamado Tipo de Tabela Definida pelo Usuário. Aqui está um exemplo de como usá-lo:
Crie seu tipo de tabela definida pelo usuário:
Em seguida, você precisa usá-lo corretamente em seu procedimento armazenado:
Finalmente, aqui está algum sql para usar em c #:
Para executar isso de SSMS
fonte
O padrão típico nesta situação é passar os elementos em uma lista delimitada por vírgulas e, em seguida, em SQL dividir isso em uma tabela que você possa usar. A maioria das pessoas geralmente cria uma função específica para fazer isso, como:
E então você pode usá-lo em outras consultas.
fonte
Não, arrays / listas não podem ser passados diretamente para o SQL Server.
As seguintes opções estão disponíveis:
fonte
Sim, torne o parâmetro Stored proc como
VARCHAR(...)
E então passe os valores separados por vírgula para um procedimento armazenado.Se você estiver usando o Sql Server 2008, você pode aproveitar TVP ( Parâmetros de valor de tabela ): SQL 2008 TVP e LINQ se a estrutura de QueryTable for mais complexa do que a matriz de strings, caso contrário, seria um exagero porque exige que o tipo de tabela seja criado no SQl Server
fonte
Faça uma tabela de dados com uma coluna em vez de List e adicione strings à tabela. Você pode passar esta tabela de dados como tipo estruturado e realizar outra junção com o campo de título de sua tabela.
fonte
Se você preferir dividir uma lista CSV em SQL, há uma maneira diferente de fazer isso usando Common Table Expressions (CTEs). Consulte Maneira eficiente de dividir string usando CTE .
fonte
A única maneira que conheço é criando uma lista CSV e depois passando-a como string. Então, no lado do SP, apenas divida e faça o que for necessário.
fonte
crie um TYPE como tabela e nomeie-o como "StringList1"
Crie um procedimento como acima e nomeie-o como "UserStringList1" s
no c #, tente isto
fonte