sábado, 12 de noviembre de 2011

SQL SERVER - Consulta hardcodeada que devuelve el ID de la fila insertada

Esta pregunta se hizo en los foros, y algunos decían que no era posible recuperar el ID de la fila insertada, esto es un error porque sí se puede recuperar ese valor. Por ese motivo surgió este post.

Algunos dirán: "para qué hardcodeas la consulta SQL? simplemente haz un procedimiento almacenado y asunto solucionado".
La verdad que a veces necesitamos este tipo de soluciones que no siempre parecen ser las óptimas, no en vano tenemos la opción de hardcodear Guiño

Además, una consulta hardcodeada también puede evitar las inyecciones SQL si pasas la información mediante parámetros.

Ahora sí, vamos al ejemplo.
1.- Abrimos el SQL SERVER Y creamos una tabla llamada cmon_group, con este script:
CREATE TABLE [dbo].[cmon_group]
(
    [groupid] [int] IDENTITY(1,1) NOT NULL,
    [title] [varchar](150) NULL,
    [description] [varchar](500) NULL,
    [icon] [varchar](50) NULL,
    CONSTRAINT [pk_cmon_group] PRIMARY KEY CLUSTERED ( [groupid] ASC )
)
2.- Abrimos Visual Studio y creamos un nuevo proyecto de tipo ASP.NET con Visual Basic, agregamos una páginas aspx y ponemos este código:
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim Title As String = "title"
        Dim description As String = "description"
        Dim icon As String = "icon"

        Dim connectionString As New SqlClient.SqlConnection("LA_CADENA_DE_CONEXION_VA_AQUI")
        Dim t_sql As String = "INSERT INTO [cmon_group](Title,description,icon) "
        t_sql &= "VALUES(@title,@description,@icon) "
        t_sql &= "SET @groupid = SCOPE_IDENTITY()"

        Dim command As New SqlClient.SqlCommand(t_sql, connectionString)
        command.CommandType = CommandType.Text

        Dim p_groupid As New SqlClient.SqlParameter("@groupid", SqlDbType.Int)
        p_groupid.Direction = ParameterDirection.Output
        command.Parameters.Add(p_groupid)

        command.Parameters.AddWithValue("@title", Title)
        command.Parameters.AddWithValue("@description", description)
        command.Parameters.AddWithValue("@icon", icon)

        command.Connection.Open()
        command.ExecuteNonQuery()
        command.Connection.Close()

        'here is the return value
        Dim groupid As Integer = CInt(p_groupid.Value)

    End Sub
Así de simple, aquí la parte interesante está en las líneas donde añado un parámetro llamado groupid, el cual es de tipo OUTPUT… lo cual me permite obtener el valor de retorno de la clave primaria, la cual se almacena en SCOPE_IDENTITY().

Es todo, espero que les sea de utilidad Guiño

2 comentarios:

leerickx dijo...

Buenos dias,
Tengo un upload de ficheros.
Al momento de insertar el fichero quiero cojer el ID del ScopeIdentity para dar un nombre especifico al fichero por ejemplo.
1CV.doc
2CV.doc
etc.
lo hago en c#
Me funciona el upload y puedo generar el ID del scope con un stocked procedure pero no consigo en cogerlo para ponerlo en el nombre del fichero.
Gracias si puede ayudarme.
From Belgica
Ricardo

Segundo Serrano dijo...

Hola,

puedes enviarme el código que usas y no te está funcionando?
envíalo a
sserrano at jabs dot com dot pe

Saludos