Variables en consulta

11/02/2009 - 22:10 por Carlos Albores | Informe spam
Buenas tardes. Necesito realizar una consulta en un stroed procedure
pasandole como condicion un parametro del mismo stored por ejemplo

Select * from rentas where folio in @rango

donde rango es una variable del stored.

Me marca error alguien que me pueda ayudar gracias de antemano

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera (MVP)
12/02/2009 - 02:07 | Informe spam
Para eso usted debe usar SQL dinámico. Vea este excelente artículo (en
inglés) del MVP Erland Sommarskog:

The Curse and Blessings of Dynamic SQL
http://www.sommarskog.se/dynamic_sql.html


Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Carlos Albores" wrote:

Buenas tardes. Necesito realizar una consulta en un stroed procedure
pasandole como condicion un parametro del mismo stored por ejemplo

Select * from rentas where folio in @rango

donde rango es una variable del stored.

Me marca error alguien que me pueda ayudar gracias de antemano
Respuesta Responder a este mensaje
#2 Alejandro Mesa
12/02/2009 - 02:21 | Informe spam
Carlos Albores,

Hombre, disculpame pero adivino no somos.

1 - Tipo de datos de la columna [folio]?
2 - Que contiene la variable @rango?
3 - Cual es exactamente el error que recives?

Chequea la sintaxis de el operador IN, en los BOL.

IN (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms177682(SQL.90).aspx

En la parte derecha se espera tener un subquery que retorna 0, 1, o mas
filas (una sola columna), o una lista de expresiones.

Ejemplo:

USE Northwind;
GO

SELECT OrderID, CustomerID, OrderDate
FROM dbo.Northwind
WHERE OrderID IN (10250, 10260, 10261);
GO

La columna OrderID es de tipo INT, y el operador buscara las filas donde el
valor de la columna OrderID aparece en la lista. SQL Server traduce esta
expresion a:

...
WHERE OrderID = 10250 OR OrderID = 10260 OR OrderID = 10261;

SQL Server no cuenta con la facilidad de macrosubstitucion, por lo que si
estas intentando hacer:

declare @rango varchar(128)

set @rando = '10250, 10260, 10262'

SELECT OrderID, CustomerID, OrderDate
FROM dbo.Northwind
WHERE OrderID IN @rango;

Entonces te dara error, pues la comparacion entre un valor entero, que en
este caso es el valor de la columna OrderID, contra una cadena de caracteres,
hara que SQL Server trate de hacer esta comparacion:

...
WHERE OrderID = '10250, 10260, 10262';

Como el tipo de dato VARCHAR tiene menor precedencia que el tipo INT,
entonces SQL Server tratara de convertir implicitamente la cadena '10250,
10260, 10262' a un valor entero y por supuesto que esto fallara.

SELECT CAST('10250, 10260, 10262' AS INT);

Para lograr que esto funcione, tendras que recurrir al uso de SQL Dinamico,
lo cual no es aconsejable para este tipo de cosas debido a la posibilidad de
injeccion de codigo SQL (busca sql injection en google), tambien porque el
plan de ejecucion es usado solo si la sentencia macha exactamente una
sentencia previa, incluyendo espacios, comentarios, etc. La otra posibilidad
es crear una funcion a la que le pases la lista y esta devuelva una tabla
donde cada fila es un elemento de la lista, por lo que podras usar un
subquery para retornar el conjunto de elementos.

...
WHERE OrderID IN (select valor from dbo.ufn_split('10250, 10260, 10262') as
t);

Si estas usando SQL Server 2008, entonces puedes usar la nueva facilidad de
parametros tipo tabla. La cual puede usarse en el servidor o desde
aplicaciones clientes, para pasar multiples filas como parametro.

Aca adjunto un link a un estupendo articulo, escrito por Erland Sommarskog,
quien es SQL Server MVP y ademas a dedicado tiempo en analizar los diferentes
metodos que pueden usarse para lograr esto.

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

Si acaso estas subscrito a la recista SQL Magazine, el maestro Itzik Ben-Gan
escribio un articulo sobre este tema, en las dos ultimas ediciones de la
revista.

AMB



"Carlos Albores" wrote:

Buenas tardes. Necesito realizar una consulta en un stroed procedure
pasandole como condicion un parametro del mismo stored por ejemplo

Select * from rentas where folio in @rango

donde rango es una variable del stored.

Me marca error alguien que me pueda ayudar gracias de antemano
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida