Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

sql dinamico

Estas en el tema de sql dinamico en el foro de SQL Server en Foros del Web. Hola gente, tengo una consulta, estoy tratando de armar una consulta q me levante de una tabla los nombres de las columnas q tenga, pero ...
  #1 (permalink)  
Antiguo 05/03/2010, 09:14
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años
Puntos: 0
sql dinamico

Hola gente, tengo una consulta, estoy tratando de armar una consulta q me levante de una tabla los nombres de las columnas q tenga, pero no se cuantas puede llegar a tener. La idea es verticalizar la tabla. El problema q tengo es q me dice q tengo q declarar la variable q uso en el select interno. lo probe sin sql dinamico y me hace exactamente lo mismo. Alguien sabe que puede ser?
Aca les copio el codigo, no es muy prolijo, soy nuevo en este lenguaje y me falta aprender.

La talba "mensajes" tiene como columnas las siguientes
mes, p_orig, dest, n_int, item y muchas columnas llamadas mensaje# que no se cuantas son, en si se, pero quiero hacer un query generico q sin importar la cantidad de columnas me ande la consulta.

La onda es volcar esa tabla a una q tenga la siguiente forma
mes, p_orig, dest, n_int, item (una fila x cada columna de mensaje) y mensaje

DECLARE @sql nvarchar(500);
DECLARE @nom_men nvarchar(50);

DECLARE nom_men_cursor CURSOR FOR
SELECT name
FROM syscolumns
WHERE NAME LIKE '%mensaje%';

OPEN nom_men_cursor;
FETCH NEXT FROM nom_men_cursor
INTO @nom_men;

set @sql= '
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT m.mes, m.p_orig, m.dest, m.n_int, m.item, [dbo].[' + @nom_men + ']
FROM mensajes m
FETCH NEXT FROM nom_men_cursor INTO @nom_men
END';

exec(@sql);

el error q me tira es el siguiente

Mens. 137, Nivel 15, Estado 2, Línea 10
Debe declarar la variable escalar "@nom_men".
Mens. 137, Nivel 15, Estado 2, Línea 16
Debe declarar la variable escalar "@nom_men".

Muchas gracias!!!!
  #2 (permalink)  
Antiguo 05/03/2010, 09:28
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 7 meses
Puntos: 39
Respuesta: sql dinamico

El error que te sale lo puedes corregir asi:
Código SQL:
Ver original
  1. WHILE @@FETCH_STATUS = 0
  2. BEGIN
  3.     SET @SQL= '
  4.    SELECT m.mes, m.p_orig, m.dest, m.n_int, m.item, [' + @nom_men + ']
  5.    FROM mensajes m '
  6.     EXEC sp_executesql(@SQL)
  7.     FETCH NEXT FROM nom_men_cursor INTO @nom_men
  8. END
Pero no estoy seguro que sea lo que buscas, ademas que recomendamos no usar cursores.
Si usas SQL 2005 puedes usar la funcion PIVOT.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 05/03/2010, 12:37
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: sql dinamico

Prueba esto a ver si es lo que quieres

Código SQL:
Ver original
  1. CREATE PROCEDURE MostrarEstructura(
  2.  @TableName VARCHAR(50)
  3. )
  4. AS
  5.  IF EXISTS (SELECT * FROM dbo.sysobjects
  6.    WHERE id = OBJECT_ID(N'[dbo].['+@tableName+']')
  7.    AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
  8.        SELECT
  9.                cols.name AS 'Nombre del Campo',
  10.                typs.name AS 'Tipo de Datos',
  11.                cols.prec AS 'Precisión',
  12.                cols.Scale AS 'Escala',
  13.                Allownulls AS 'Permite Nulos',
  14.                c.text AS 'Valor por Defecto',
  15.                pk.xtype AS 'Primary Key',
  16.                indx.name AS 'Nombre del Índice'
  17.        FROM sysobjects sobj
  18.        INNER JOIN syscolumns cols ON sobj.id=cols.id
  19.        INNER JOIN systypes typs ON cols.xusertype=typs.xusertype
  20.        LEFT JOIN syscomments c ON cdefault=c.id
  21.        LEFT JOIN  sysindexkeys ik ON ik.id = cols.id AND ik.colid = cols.colid
  22.        LEFT JOIN  sysindexes indx ON indx.id = ik.id AND indx.indid = ik.indid
  23.        LEFT JOIN  sysobjects pk ON indx.name = pk.name AND pk.parent_obj = indx.id AND pk.xtype = 'PK'
  24.        WHERE cols.id = OBJECT_ID(@tableName)
  25.  ELSE
  26.   PRINT 'No existe ninguna tabla llamada '+@tableName + ' en la base de datos ' + db_name() + '.'
  27. RETURN


Tomado de aquí:
http://www.webtutoriales.com/tutoria...-mssql.39.html
__________________
Mi blog de temas más o menos técnicos

Y aquí el Jamón jamon de Jabugo
  #4 (permalink)  
Antiguo 08/03/2010, 08:58
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años
Puntos: 0
Respuesta: sql dinamico

Cita:
Iniciado por flaviovich Ver Mensaje
El error que te sale lo puedes corregir asi:
Código SQL:
Ver original
  1. WHILE @@FETCH_STATUS = 0
  2. BEGIN
  3.     SET @SQL= '
  4.    SELECT m.mes, m.p_orig, m.dest, m.n_int, m.item, [' + @nom_men + ']
  5.    FROM mensajes m '
  6.     EXEC sp_executesql(@SQL)
  7.     FETCH NEXT FROM nom_men_cursor INTO @nom_men
  8. END
Pero no estoy seguro que sea lo que buscas, ademas que recomendamos no usar cursores.
Si usas SQL 2005 puedes usar la funcion PIVOT.
Muchas Gracias!!! con este anduvo!!!! solo q tuve q cambiar esto:
de esto= exec sp_executesql(@sql)
poner esto exec (@sql)

Muchas gracias!!!!
  #5 (permalink)  
Antiguo 08/03/2010, 09:55
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: sql dinamico

No se porque, el sp_executesql, es especial para la ejecucion de query dinamico, tal vez te falto declarar @sql como NVARCHAR

Etiquetas: dinamico, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:38.