Bem esses dias precisei de pegar o maior número de uma coluna onde tinha ali números e letras acontece que se fizermos max(codigo) ele não funciona pois as vezes a coluna é string e não inteiro. Para resolver o problema é preciso incluir uma função personalizada no seu banco, segue-se abaixo comando para criar a função:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public static void setFuncaoSQLUltimoCodigo() { String connetionString = Dados.StringDeConexao; SqlConnection conexaoSql = new SqlConnection(connetionString); SqlCommand comando = conexaoSql.CreateCommand(); // query para inserir a liberacao string strSQL = "CREATE FUNCTION [dbo].[getSomenteInt] (@string VARCHAR(8000)) " + "RETURNS VARCHAR(8000) AS BEGIN DECLARE @IncorrectCharLoc SMALLINT " + "SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string) " + "WHILE @IncorrectCharLoc > 0 BEGIN SET @string = " + "STUFF(@string, @IncorrectCharLoc, 1, '0') SET @IncorrectCharLoc = " + "PATINDEX('%[^0-9]%', @string) END SET @string = @string " + "RETURN @string END"; try { // abre o banco conexaoSql.Open(); // atribui a query de alteracao da licenca comando.CommandText = strSQL; // executa a query comando.ExecuteNonQuery(); } //Trata a exceção catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } finally { //fecha a conexao conexaoSql.Close(); } } |
Depois é só usar a função na query por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public String getUltimoCodigo() { String ultimocod = ""; using (SqlConnection con = new SqlConnection(DAL.Dados.StringDeConexao)) { try { const string SQL = "SELECT Max(dbo.getSomenteInt(Codigo_Ordenacao)) as col FROM Produtos"; SqlCommand cmd = new SqlCommand(SQL, con); con.Open(); ultimocod = cmd.ExecuteScalar().ToString(); } catch { con.Close(); } finally { con.Close(); } } return ultimocod; } |