Error en Clausula IN en Procedimiento Alm.

10/08/2007 - 10:58 por Marcel | Informe spam
Hola. Gracias a todos de antemano.
Como vereis empiezo a escribir procedimientos almacenados.
Tengo un problema al ejecutar con una clausula IN
con un dato en tabla smallint.


Tengo una tabla con el dato CTT_COMPRA_VENTA que es smallint
y una declaracion similar a esto.

DECLARE @lsCOMPRAVENTA es nvarchar(10)

if...
SET @lsCOMPRAVENTA='2,3'
else...
SET @lsCOMPRAVENTA='8,3'

Select
AND CTT_COMPRA_VENTA IN (@lsCOMPRAVENTA)

Al ejecutarlo me da este error

Mens. 245, Nivel 16, Estado 1, Línea 47
Syntax error converting the nvarchar value '2,3' to a column of data
type smallint.

¿Como se escribe en este caso el IN?

porque escrito a pelo AND CTT_COMPRA_VENTA IN (2,3) no da error
y si @lsCOMPRAVENTA tiene un solo valor SET @lsCOMPRAVENTA='2' tampoco
da error

Preguntas similare

Leer las respuestas

#1 Ana
10/08/2007 - 11:53 | Informe spam
Buenas manuel

Prueba a convertir el valor @lsCompraVenta (cuando lo utilices en el IN) a
smallint (utiliza el convert)


"Marcel" wrote in message
news:
Hola. Gracias a todos de antemano.
Como vereis empiezo a escribir procedimientos almacenados.
Tengo un problema al ejecutar con una clausula IN
con un dato en tabla smallint.


Tengo una tabla con el dato CTT_COMPRA_VENTA que es smallint
y una declaracion similar a esto.

DECLARE @lsCOMPRAVENTA es nvarchar(10)

if...
SET @lsCOMPRAVENTA='2,3'
else...
SET @lsCOMPRAVENTA='8,3'

Select
AND CTT_COMPRA_VENTA IN (@lsCOMPRAVENTA)

Al ejecutarlo me da este error

Mens. 245, Nivel 16, Estado 1, Línea 47
Syntax error converting the nvarchar value '2,3' to a column of data type
smallint.

¿Como se escribe en este caso el IN?

porque escrito a pelo AND CTT_COMPRA_VENTA IN (2,3) no da error
y si @lsCOMPRAVENTA tiene un solo valor SET @lsCOMPRAVENTA='2' tampoco da
error
Respuesta Responder a este mensaje
#2 principiante
10/08/2007 - 14:11 | Informe spam
Tal cual lo pones para usar un IN sería para usar SQL dinamico.

A menos que repitas el select completo dentro del if.. else.. por ejemplo:

if...
Select
AND CTT_COMPRA_VENTA IN (2,3)
else...
Select
AND CTT_COMPRA_VENTA IN (8,3)


Otra manera (menos eficiente) seria usar o adaptar una funcion PatIndex en
vez de usar el IN.


Jose TH


"Marcel" escribió en el mensaje
news:
Hola. Gracias a todos de antemano.
Como vereis empiezo a escribir procedimientos almacenados.
Tengo un problema al ejecutar con una clausula IN
con un dato en tabla smallint.


Tengo una tabla con el dato CTT_COMPRA_VENTA que es smallint
y una declaracion similar a esto.

DECLARE @lsCOMPRAVENTA es nvarchar(10)

if...
SET @lsCOMPRAVENTA='2,3'
else...
SET @lsCOMPRAVENTA='8,3'

Select
AND CTT_COMPRA_VENTA IN (@lsCOMPRAVENTA)

Al ejecutarlo me da este error

Mens. 245, Nivel 16, Estado 1, Línea 47
Syntax error converting the nvarchar value '2,3' to a column of data type
smallint.

¿Como se escribe en este caso el IN?

porque escrito a pelo AND CTT_COMPRA_VENTA IN (2,3) no da error
y si @lsCOMPRAVENTA tiene un solo valor SET @lsCOMPRAVENTA='2' tampoco da
error
Respuesta Responder a este mensaje
#3 Alejandro Mesa
10/08/2007 - 16:06 | Informe spam
Hola Marcel,

Esa es la sentencia que tratas de ejecutar:

select *
from dbo.tu_tabla
where CTT_COMPRA_VENTA IN (@lsCOMPRAVENTA)

la cual es similar a:

select *
from dbo.tu_tabla
where CTT_COMPRA_VENTA IN ('2, 3') -- FIJATE EN LA LISTA DE ELEMENTOS

Como te daras cuenta,, existe un solo elemento en la lista relacionada con
el operador IN y este elemento es tipo caracter, por lo que sql server
tratara de convertir este valor al tipo usado por la columna
[CTT_COMPRA_VENTA], ya que este tiene mayor precedencia. El valor '2, 3' no
es un valor [smallint] valido.

En este caso debes usar sql dinamico para lograr lo que deseas. Pero ojo,
existe una serie de implicaciones al hacerlo. Tomate tu tiempo en leer este
articulo, el cual esplica de forma detallada, como usar sql dinamico.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html

AMB

"Marcel" wrote:

Hola. Gracias a todos de antemano.
Como vereis empiezo a escribir procedimientos almacenados.
Tengo un problema al ejecutar con una clausula IN
con un dato en tabla smallint.


Tengo una tabla con el dato CTT_COMPRA_VENTA que es smallint
y una declaracion similar a esto.

DECLARE @lsCOMPRAVENTA es nvarchar(10)

if...
SET @lsCOMPRAVENTA='2,3'
else...
SET @lsCOMPRAVENTA='8,3'

Select
AND CTT_COMPRA_VENTA IN (@lsCOMPRAVENTA)

Al ejecutarlo me da este error

Mens. 245, Nivel 16, Estado 1, Línea 47
Syntax error converting the nvarchar value '2,3' to a column of data
type smallint.

¿Como se escribe en este caso el IN?

porque escrito a pelo AND CTT_COMPRA_VENTA IN (2,3) no da error
y si @lsCOMPRAVENTA tiene un solo valor SET @lsCOMPRAVENTA='2' tampoco
da error

Respuesta Responder a este mensaje
#4 Maxi
11/08/2007 - 16:42 | Informe spam
Hola Marcel, lo que realmente tu quieres hacer es pasar un array a un Store
procedure como parametro de entrada, para hacerlo hay varias formas, una
seria pasandolo separado por comas , otra en XML y tambien podrias usar
SQL-Dinamico (en este caso yo no lo veo necesario).
Si es un solo campo digamos es mas perfomante hacerlo con separacion de
comas aunque no sea tan desacoplado como un XML.

Te dejo este link

http://www.sqlteam.com/article/pass...-procedure



"Marcel" wrote in message
news:
Hola. Gracias a todos de antemano.
Como vereis empiezo a escribir procedimientos almacenados.
Tengo un problema al ejecutar con una clausula IN
con un dato en tabla smallint.


Tengo una tabla con el dato CTT_COMPRA_VENTA que es smallint
y una declaracion similar a esto.

DECLARE @lsCOMPRAVENTA es nvarchar(10)

if...
SET @lsCOMPRAVENTA='2,3'
else...
SET @lsCOMPRAVENTA='8,3'

Select
AND CTT_COMPRA_VENTA IN (@lsCOMPRAVENTA)

Al ejecutarlo me da este error

Mens. 245, Nivel 16, Estado 1, Línea 47
Syntax error converting the nvarchar value '2,3' to a column of data type
smallint.

¿Como se escribe en este caso el IN?

porque escrito a pelo AND CTT_COMPRA_VENTA IN (2,3) no da error
y si @lsCOMPRAVENTA tiene un solo valor SET @lsCOMPRAVENTA='2' tampoco da
error
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida