![]() |
| |||
| Que tal amigos. Tengo la siguiente tabla. Vendedores 1 Id_Vendedor smallint 2 Nombre nvarchar(50) en .NET tengo el siguiente codigo. dim lista="1,4" dim cnn as sqlconexion=abrir_conexion(server,bd) dim cmd as new sqlcomand("Select Id_Vendedor from Vendedores WHERE Id_Vendedor IN('" & lista & "'",cnn) dim dr as sqldatareader=cmd.executereader 'Hasta aqui funciona perfectamente cuando yo quiero seleccionar solamente 'los vendedores 1 y 4 Mi problema viene cuando lo hago mediante un Store Procedure. Ej. dim lista="1,4" dim cnn as sqlconexion=abrir_conexion(server,bd) Dim cmd As New SqlCommand("Seleccion", cnn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("***Id_Vendedor", SqlDbType.NVarChar, 15).Value = lista Dim dr As SqlDataReader = cmd.ExecuteReader '****Store Procedure Alter Procedure Seleccion ***lista as nvarchar(15) AS Select Id_Vendedor WHERE Id_Vendedor IN(lista) 'Aqui me envia un error.. Conversion failed when converting the nvarchar value '1,4' to data type smallint. Lo que no entiendo porque desde un texto en un Command no tengo ningún problema, solo cuando lo ejecuto directamente en el Store Procedure. Saludos |
| | ||||
| ||||
| |
| |||
| "Manolo Zepeda" <ManoloZepeda***discussions.microsoft.com> wrote in message news:03073FB3-5A2F-4869-8F6D-2A4FAD7B8BB0***microsoft.com... > Tengo la siguiente tabla. > > Vendedores > 1 Id_Vendedor smallint > 2 Nombre nvarchar(50) > > en .NET tengo el siguiente codigo. > dim lista="1,4" > dim cnn as sqlconexion=abrir_conexion(server,bd) > dim cmd as new sqlcomand("Select Id_Vendedor from Vendedores WHERE > Id_Vendedor IN('" & lista & "'",cnn) > dim dr as sqldatareader=cmd.executereader > 'Hasta aqui funciona perfectamente cuando yo quiero seleccionar solamente > 'los vendedores 1 y 4 > > Mi problema viene cuando lo hago mediante un Store Procedure. > Ej. > dim lista="1,4" > dim cnn as sqlconexion=abrir_conexion(server,bd) > Dim cmd As New SqlCommand("Seleccion", cnn) > cmd.CommandType = CommandType.StoredProcedure > cmd.Parameters.Add("***Id_Vendedor", SqlDbType.NVarChar, 15).Value = lista > Dim dr As SqlDataReader = cmd.ExecuteReader > > '****Store Procedure > Alter Procedure Seleccion > ***lista as nvarchar(15) > AS > Select Id_Vendedor WHERE Id_Vendedor IN(lista) > > 'Aqui me envia un error.. > Conversion failed when converting the nvarchar value '1,4' to data type > smallint. > Lo que no entiendo porque desde un texto en un Command no tengo ningún > problema, solo cuando lo ejecuto directamente en el Store Procedure. La diferencia no está en que se trate de un stored procedure o de un command, sino en que se use parametrización o Sql Dinámico. En tu command estás usando sql dinámico (concatenando el texto en la sentencia), mientras que en el stored procedure estás usando un parámetro en la sentencia, cosa que no es lÃ***cita para pasar la lista de valores de un IN. Si utilizases parámetros en el Command, te fallarÃ***a igual que el stored procedure. Y si usas Sql dinámico en el stored procedure (concatenando el texto y ejecutándolo con EXEC o con sp_executesql), te funcionará igual que tu command. |
| |||
| "Manolo Zepeda" <ManoloZepeda***discussions.microsoft.com> wrote in message news:03073FB3-5A2F-4869-8F6D-2A4FAD7B8BB0***microsoft.com... > Tengo la siguiente tabla. > > Vendedores > 1 Id_Vendedor smallint > 2 Nombre nvarchar(50) > > en .NET tengo el siguiente codigo. > dim lista="1,4" > dim cnn as sqlconexion=abrir_conexion(server,bd) > dim cmd as new sqlcomand("Select Id_Vendedor from Vendedores WHERE > Id_Vendedor IN('" & lista & "'",cnn) > dim dr as sqldatareader=cmd.executereader > 'Hasta aqui funciona perfectamente cuando yo quiero seleccionar solamente > 'los vendedores 1 y 4 > > Mi problema viene cuando lo hago mediante un Store Procedure. > Ej. > dim lista="1,4" > dim cnn as sqlconexion=abrir_conexion(server,bd) > Dim cmd As New SqlCommand("Seleccion", cnn) > cmd.CommandType = CommandType.StoredProcedure > cmd.Parameters.Add("***Id_Vendedor", SqlDbType.NVarChar, 15).Value = lista > Dim dr As SqlDataReader = cmd.ExecuteReader > > '****Store Procedure > Alter Procedure Seleccion > ***lista as nvarchar(15) > AS > Select Id_Vendedor WHERE Id_Vendedor IN(lista) > > 'Aqui me envia un error.. > Conversion failed when converting the nvarchar value '1,4' to data type > smallint. > Lo que no entiendo porque desde un texto en un Command no tengo ningún > problema, solo cuando lo ejecuto directamente en el Store Procedure. La diferencia no está en que se trate de un stored procedure o de un command, sino en que se use parametrización o Sql Dinámico. En tu command estás usando sql dinámico (concatenando el texto en la sentencia), mientras que en el stored procedure estás usando un parámetro en la sentencia, cosa que no es lÃ***cita para pasar la lista de valores de un IN. Si utilizases parámetros en el Command, te fallarÃ***a igual que el stored procedure. Y si usas Sql dinámico en el stored procedure (concatenando el texto y ejecutándolo con EXEC o con sp_executesql), te funcionará igual que tu command. |
| |||
| "Manolo Zepeda" <ManoloZepeda***discussions.microsoft.com> wrote in message news:03073FB3-5A2F-4869-8F6D-2A4FAD7B8BB0***microsoft.com... > Tengo la siguiente tabla. > > Vendedores > 1 Id_Vendedor smallint > 2 Nombre nvarchar(50) > > en .NET tengo el siguiente codigo. > dim lista="1,4" > dim cnn as sqlconexion=abrir_conexion(server,bd) > dim cmd as new sqlcomand("Select Id_Vendedor from Vendedores WHERE > Id_Vendedor IN('" & lista & "'",cnn) > dim dr as sqldatareader=cmd.executereader > 'Hasta aqui funciona perfectamente cuando yo quiero seleccionar solamente > 'los vendedores 1 y 4 > > Mi problema viene cuando lo hago mediante un Store Procedure. > Ej. > dim lista="1,4" > dim cnn as sqlconexion=abrir_conexion(server,bd) > Dim cmd As New SqlCommand("Seleccion", cnn) > cmd.CommandType = CommandType.StoredProcedure > cmd.Parameters.Add("***Id_Vendedor", SqlDbType.NVarChar, 15).Value = lista > Dim dr As SqlDataReader = cmd.ExecuteReader > > '****Store Procedure > Alter Procedure Seleccion > ***lista as nvarchar(15) > AS > Select Id_Vendedor WHERE Id_Vendedor IN(lista) > > 'Aqui me envia un error.. > Conversion failed when converting the nvarchar value '1,4' to data type > smallint. > Lo que no entiendo porque desde un texto en un Command no tengo ningún > problema, solo cuando lo ejecuto directamente en el Store Procedure. La diferencia no está en que se trate de un stored procedure o de un command, sino en que se use parametrización o Sql Dinámico. En tu command estás usando sql dinámico (concatenando el texto en la sentencia), mientras que en el stored procedure estás usando un parámetro en la sentencia, cosa que no es lÃ***cita para pasar la lista de valores de un IN. Si utilizases parámetros en el Command, te fallarÃ***a igual que el stored procedure. Y si usas Sql dinámico en el stored procedure (concatenando el texto y ejecutándolo con EXEC o con sp_executesql), te funcionará igual que tu command. |
| |||
| "Manolo Zepeda" <ManoloZepeda***discussions.microsoft.com> wrote in message news:6E1F76B2-5AA1-426C-9BCE-4A0C13B646B2***microsoft.com... > Gracias por tu atención a mi mensaje. > Entonces la única forma de mandar valores para una clausila IN mediante un > parametro serÃ***a con Sql dinámico? Me temo que sÃ***. Si te da reparo el Sql Dinámico (por razones de protección contra inyecciones de Sql, optimización de procedimientos precompilados, etc.), lo que hay que hacer es buscar una alternativa al IN. Una posibilidad es pasar los valores del IN en un parámetro de tipo XML y luego usar los operadores de manejo de XML del Sql Server 2005 para condicionar la sentencia Select. Otra posibilidad es pasar los valores del IN en una tabla temporal, y usar un Join en lugar del IN, o una subcláusula, para filtrar el select principal con la tabla temporal. |
| |||
| "Manolo Zepeda" <ManoloZepeda***discussions.microsoft.com> wrote in message news:6E1F76B2-5AA1-426C-9BCE-4A0C13B646B2***microsoft.com... > Gracias por tu atención a mi mensaje. > Entonces la única forma de mandar valores para una clausila IN mediante un > parametro serÃ***a con Sql dinámico? Me temo que sÃ***. Si te da reparo el Sql Dinámico (por razones de protección contra inyecciones de Sql, optimización de procedimientos precompilados, etc.), lo que hay que hacer es buscar una alternativa al IN. Una posibilidad es pasar los valores del IN en un parámetro de tipo XML y luego usar los operadores de manejo de XML del Sql Server 2005 para condicionar la sentencia Select. Otra posibilidad es pasar los valores del IN en una tabla temporal, y usar un Join en lugar del IN, o una subcláusula, para filtrar el select principal con la tabla temporal. |
| |||
| "Manolo Zepeda" <ManoloZepeda***discussions.microsoft.com> wrote in message news:6E1F76B2-5AA1-426C-9BCE-4A0C13B646B2***microsoft.com... > Gracias por tu atención a mi mensaje. > Entonces la única forma de mandar valores para una clausila IN mediante un > parametro serÃ***a con Sql dinámico? Me temo que sÃ***. Si te da reparo el Sql Dinámico (por razones de protección contra inyecciones de Sql, optimización de procedimientos precompilados, etc.), lo que hay que hacer es buscar una alternativa al IN. Una posibilidad es pasar los valores del IN en un parámetro de tipo XML y luego usar los operadores de manejo de XML del Sql Server 2005 para condicionar la sentencia Select. Otra posibilidad es pasar los valores del IN en una tabla temporal, y usar un Join en lugar del IN, o una subcláusula, para filtrar el select principal con la tabla temporal. |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Cómo almacenar una Cláusula WHERE en una variable | Faiverlgr | Newsgroup microsoft.public.es.vfoxpro | 6 | 24-04-2008 00:16:02 |
| restriccion en clausula IN ?? | DarthSidious | Newsgroup microsoft.public.es.sqlserver | 2 | 05-03-2008 13:12:01 |
| Clausula SELECT | daniel | Newsgroup microsoft.public.es.sqlserver | 4 | 03-02-2008 21:34:53 |
| clausula group by | Mayo | Newsgroup microsoft.public.es.vfoxpro.datos | 6 | 12-04-2006 15:09:39 |