none
SqlCommand com in e retorno do sql com parâmetros populados RRS feed

  • Pergunta

  • Boa tarde pessoal estou tentando montar um sqlcommando que aceite valores para um in no sql alguém têm uma ideia?

    Exemplo: string sql = @"select descritivo, valor, id, debitos from despesas where funid in(@valor)"

    SqlCommand cmdDividas = new SqlCommand();
    cmdDividas.CommandText = sql;
    cmdDividas.CommandType = CommandType.Text;
    cmdDividas.Connection = conn;
    cmdDividas.Parameters.AddWithValue("@valor", "1,2,3,4,5,6");
    O exemplo acima não funciona ele esta sem colocando '1,2,3,4,5,6'
    A solução encontrada foi:
    string sql = @"select descritivo, valor, id, debitos from despesas where funid in("+ "1,2,3,4,5,6" +")";
    isso e variavel mas nunca esta vazio "1,2,3,4,5,6".
    Outra coisa é como posso recuperar o sql do commando com o parametros todo populados?
    Tipo: string sql = @"select descritivo, valor, id, debitos from despesas where funid in(@valor)"
    cmdDividas.CommandText sempre me retorna "select descritivo, valor, id, debitos from despesas where funid in(@valor)"
    Obrigado



    quarta-feira, 8 de fevereiro de 2017 19:48

Respostas

  • Voce nao pode fazer isso. 

    Para que isso funcione voce tem que fazer como descrito neste artigo:

    http://nodogmablog.bryanhogan.net/2016/01/parameterize-sql-where-in-clause-c/

    Os parametros nao aceitam array e por isso quando voce passa o parametro o SQL intrempreta assim:

    where campo in ('1,2,3,4,5')

    ao inves de 

    where campo in ('1','2','3','4','5')

    entendeu a diferença?

    Outra forma é criar uma funcao split no sql :http://stackoverflow.com/questions/697519/split-function-equivalent-in-t-sql

    CREATE FUNCTION [dbo].[split](
              @delimited NVARCHAR(MAX),
              @delimiter NVARCHAR(100)
            ) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
            AS
            BEGIN
              DECLARE @xml XML
              SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
    
              INSERT INTO @t(val)
              SELECT  r.value('.','varchar(MAX)') as item
              FROM  @xml.nodes('/t') as records(r)
              RETURN
            END

    ai seu comando ficaria assim:

    string sql = @"select descritivo, valor, id, debitos from despesas where funid in( select val from dbo.split(@valor))"

    Note que o comando acima so vai funcionar se voce criar a funcao split no sql server (o 2016 possui uma funcao nativa)

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 8 de fevereiro de 2017 20:37
    Moderador