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

transact STORE PROCEDURE

Estas en el tema de transact STORE PROCEDURE en el foro de SQL Server en Foros del Web. Hola, tengo una APP que busca en muchas marcas. Tengo un SP que le tengo que pasar por parametros las marcas. Como hago para agregar ...
  #1 (permalink)  
Antiguo 09/08/2011, 12:43
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
transact STORE PROCEDURE

Hola, tengo una APP que busca en muchas marcas.

Tengo un SP que le tengo que pasar por parametros las marcas.
Como hago para agregar en el where las marcas que quiere, ya que no puedo creer que tenga que agregar un parametro de entrada por cada marca.

select * from marcas where @marcas

NO LE PUEDO PASAR POR PARAMETRO EL WHERE ARMADO?
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #2 (permalink)  
Antiguo 09/08/2011, 13:11
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

Si, utilizas QUERDY DINAMICO (buscalo por aca).

O bien, si tu version es 2005 o superior, pasale un tipo de dato TABLE (arreglo dinamico) y manejalo en tu store procedure como una vil tabla.
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 09/08/2011, 13:14
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Gracias por responder.
Sabes que uso SQL 2005 si y no tengo mucha idea de SP.
Tampoco se a que te referis con una tabla vil o arreglo :(


Cita:
Iniciado por iislas Ver Mensaje
Si, utilizas QUERDY DINAMICO (buscalo por aca).

O bien, si tu version es 2005 o superior, pasale un tipo de dato TABLE (arreglo dinamico) y manejalo en tu store procedure como una vil tabla.
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #4 (permalink)  
Antiguo 09/08/2011, 13:17
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

Bueno, a partir de la version 2005, se implemento un nuevo tipo de dato (TABLE), que viene siendo un arreglo dinamico de columnas y registros.

Este tipo de dato, ya lo puede recibir tu SP (Store Procedure) y lo tratas internamente como una tabla.

¿Me explico?
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 09/08/2011, 13:19
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Bien, entiendo eso si.
Tendria que pasarle una tabla de parametro y luego recorrerla en el sql e ir armando el where?

Muchas gracias.

Cita:
Iniciado por iislas Ver Mensaje
Bueno, a partir de la version 2005, se implemento un nuevo tipo de dato (TABLE), que viene siendo un arreglo dinamico de columnas y registros.

Este tipo de dato, ya lo puede recibir tu SP (Store Procedure) y lo tratas internamente como una tabla.

¿Me explico?
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #6 (permalink)  
Antiguo 09/08/2011, 13:48
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: transact STORE PROCEDURE

Puedes hacer un query dinamico de la sig forma:


create procedure test (@cadena varchar(max)
as
begin
declare @query varchar(max)
set @query='select * from data ' + @cadena
exec Sp_sqlExec @query
end


en la variable cadena mandas tu where como quieras where campo=1

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 09/08/2011, 13:55
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Perdona que te joda asi pero como te comente antes no tengo mucha idea de esto.
Todo esto es para optimizar una pagina y que no retorne todos los registros, solo los que se estan mostrando en una grilla.


Este es el SP que tengo hasta ahrora y donde dice importante es donde tengo problemas.
Se entiende?

MUCHAS GRACIAS.


USE [GallitoDigital]
GO
/****** Object: StoredProcedure [dbo].[GetAutos] Script Date: 08/09/2011 12:50:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
alter PROCEDURE [dbo].[GetAutosMult]
@PageIndex int
,@PageSize int
,@Orden varchar(80)
,@RecordCount int out
,@TipoOrden varchar(80)
,@Marcas varchar(max)
,@TipoOrdenAscDesc varchar(10)
AS
BEGIN
SET NOCOUNT ON;

SELECT Cla.ClaDsc, AviProCod, AviSolWeb, Textos.AviTxt, Avisos.AviCantFot, Avisos.AviCantVis, Avisos.AviVtaCod, Avisos.AviSbpCod, Avisos.AviRec, Avisos.AviDisSup, Avisos.AviDisInf, Avisos.AviOpeNro, Avisos.AviWebFot,Avisos.AviUbiInt4, Avisos.AviUbiInt2, Avisos.AviRecCol, Avisos.AviCabCol, Avisos.AviFonCol, AutMod.AutModDsc, DetAutCero, DetAutMon, DetAutAlar, DetAutBlq, DetAutAirb, DetAutABS, DetAutAire, DetAutAlza, DetAutCil, DetAutColo, DetAutDire, DetAutEstV, DetAutKmt, DetAutAnio, DetAutTran, DetAutTpoA, DetAutImp, ROW_NUMBER() OVER
(ORDER BY Avisos.AviUbiInt4 desc, Avisos.AviWebFot desc, Textos.AviTxtOrd
) AS RowNumber


INTO #Results
FROM Avisos INNER JOIN Textos ON Avisos.AviVtaCod = Textos.AviVtaCod INNER JOIN DetAuto ON Avisos.AviVtaCod = DetAuto.DetAutCod INNER JOIN AUTMAR ON DetAuto.DetAutMarC = AUTMAR.AutMarCod AND DetAuto.DetAutTpoC = AUTMAR.AutTpoCod INNER JOIN AUTMOD ON DetAuto.DetAutMarC = AUTMOD.AutMarCod AND DetAuto.DetAutTpoC = AUTMOD.AutTpoCod AND DetAuto.DetAutModC = AUTMOD.AutModCod INNER JOIN AUTTPO ON AUTMOD.AutTpoCod = AUTTPO.AutTpoCod inner join cla on cla.clacod = avisos.aviclacod

/*Lo importante*/
Where (Avisos.AviSbpCod <> 3) and (avisos.avisbpcod <> 5) --and @Marcas

/*-------------------------*/

SELECT @RecordCount = COUNT(*)
FROM #Results

SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

DROP TABLE #Results

END
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #8 (permalink)  
Antiguo 09/08/2011, 15:41
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

En lugar de pasar tu variable @Marcas como un VARCHAR, lo debes pasar como un TABLE

http://msdn.microsoft.com/es-es/library/ms175010.aspx

Y donde dice IMPORTANTE, le haces un JOIN con tu variable @Marcas

¿Se comprende?
__________________
MCTS Isaias Islas
  #9 (permalink)  
Antiguo 09/08/2011, 17:22
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Entiendo lo de pasarlo como tabla.
Lo que no entiendo es como hacer el join y como me ayuda ya que en esa tabla solo tendria las marcas necesarias.

Es increible que no se pueda concatenar algo pasado por parametro

Gracias.

Cita:
Iniciado por iislas Ver Mensaje
En lugar de pasar tu variable @Marcas como un VARCHAR, lo debes pasar como un TABLE

http://msdn.microsoft.com/es-es/library/ms175010.aspx

Y donde dice IMPORTANTE, le haces un JOIN con tu variable @Marcas

¿Se comprende?
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #10 (permalink)  
Antiguo 10/08/2011, 07:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: transact STORE PROCEDURE

ya probaste la opcion que te recomende con el query dinamico???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 10/08/2011, 10:01
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Cita:
Iniciado por Libras Ver Mensaje
ya probaste la opcion que te recomende con el query dinamico???
Si pero me da error.
Me dice Must declare the scalar variable "@RecordCount"
Que son los parametros de entrada y salida


USE [GallitoDigital]
GO
/****** Object: StoredProcedure [dbo].[GetAutosMult] Script Date: 08/10/2011 12:11:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER PROCEDURE [dbo].[GetAutosMult]
@PageIndex int
,@PageSize int
,@Orden varchar(80)
,@RecordCount int out
,@TipoOrden varchar(80)
,@Marcas varchar(max)
,@TipoOrdenAscDesc varchar(10)
AS
declare @query varchar(max);
BEGIN

SET NOCOUNT ON;

set @query='SELECT Cla.ClaDsc, AviProCod, AviSolWeb, Textos.AviTxt, Avisos.AviCantFot, Avisos.AviCantVis, Avisos.AviVtaCod, Avisos.AviSbpCod, Avisos.AviRec, Avisos.AviDisSup, Avisos.AviDisInf, Avisos.AviOpeNro, Avisos.AviWebFot,Avisos.AviUbiInt4, Avisos.AviUbiInt2, Avisos.AviRecCol, Avisos.AviCabCol, Avisos.AviFonCol, AutMod.AutModDsc, DetAutCero, DetAutMon, DetAutAlar, DetAutBlq, DetAutAirb, DetAutABS, DetAutAire, DetAutAlza, DetAutCil, DetAutColo, DetAutDire, DetAutEstV, DetAutKmt, DetAutAnio, DetAutTran, DetAutTpoA, DetAutImp, ROW_NUMBER() OVER (ORDER BY Avisos.AviUbiInt4 desc, Avisos.AviWebFot desc, Textos.AviTxtOrd
) AS RowNumber


INTO #Results
FROM Avisos INNER JOIN Textos ON Avisos.AviVtaCod = Textos.AviVtaCod INNER JOIN DetAuto ON Avisos.AviVtaCod = DetAuto.DetAutCod INNER JOIN AUTMAR ON DetAuto.DetAutMarC = AUTMAR.AutMarCod AND DetAuto.DetAutTpoC = AUTMAR.AutTpoCod INNER JOIN AUTMOD ON DetAuto.DetAutMarC = AUTMOD.AutMarCod AND DetAuto.DetAutTpoC = AUTMOD.AutTpoCod AND DetAuto.DetAutModC = AUTMOD.AutModCod INNER JOIN AUTTPO ON AUTMOD.AutTpoCod = AUTTPO.AutTpoCod inner join cla on cla.clacod = avisos.aviclacod

Where (Avisos.AviSbpCod <> 3) and (avisos.avisbpcod <> 5) and (' + @Marcas + ')



SELECT @RecordCount = COUNT(*)
FROM #Results

SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

DROP TABLE #Results'

exec Sp_sqlExec @query

END
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #12 (permalink)  
Antiguo 10/08/2011, 13:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

Amigo, no has hecho el query dinamico, ni has leido sobre parametros de tabla, eso que ni que.

Código SQL:
Ver original
  1. DECLARE @MyTabla sysname
  2. DECLARE @MySQLString nvarchar(100)
  3. SET @MyTabla = 'cliente'
  4. SET @MySQLString = N'SELECT * FROM ' + @MyTabla
  5. EXECUTE sp_executesql @MySQLString
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 12/08/2011, 08:45
Avatar de vrenzo  
Fecha de Ingreso: febrero-2007
Mensajes: 289
Antigüedad: 17 años, 9 meses
Puntos: 15
Respuesta: transact STORE PROCEDURE

Gracias... iislas... justo necesite esta información.
__________________
***
Saludos.
  #14 (permalink)  
Antiguo 12/08/2011, 08:56
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

Pues que extraño, porque LIBRAS ya le habia dicho que utilizara QUERY DINAMICO.
__________________
MCTS Isaias Islas
  #15 (permalink)  
Antiguo 22/08/2011, 09:56
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Al final lo logre así ya que la ultima parte era la que me complico mas.
Gracias a todos.
Saludos.

GO
-- =============================================
ALTER PROCEDURE [dbo].[GetAutoss]
@PageIndex int
,@PageSize int
,@Tipo int
,@FchPub datetime
,@RecordCount int out
AS
BEGIN

declare @ColumnasSalida varchar(2055)
declare @Order varchar(2055)
declare @ClausulaFrom varchar(2055)
declare @ClausulaWhere varchar(2055)
declare @SentenciaSELECT varchar(2055)


set @ColumnasSalida = 'Avisos.AviProCod, Avisos.AviSolWeb, Textos.AviTxt, Avisos.AviCantFot,
Avisos.AviCantVis, Avisos.AviVtaCod, Avisos.AviSbpCod, Avisos.AviRec,
Avisos.AviDisSup, Avisos.AviDisInf, Avisos.AviOpeNro, Avisos.AviWebFot,
Avisos.AviUbiInt4, Avisos.AviUbiInt2, Avisos.AviRecCol, Avisos.AviCabCol,
Avisos.AviFonCol, AutMod.AutModDsc, DetAutCero, DetAutMon, DetAutAlar,
DetAutBlq, DetAutAirb, DetAutABS, DetAutAire, DetAutAlza, DetAutCil,
DetAutColo, DetAutDire, DetAutEstV, DetAutKmt, DetAutAnio, DetAutTran,
DetAutTpoA, DetAutImp, '
set @Order = 'ROW_NUMBER() OVER (ORDER BY Avisos.AviUbiInt4 desc, Avisos.AviWebFot desc, Textos.AviTxtOrd) AS RowNumber'
set @ClausulaFrom = 'Avisos INNER JOIN Textos ON Avisos.AviVtaCod = Textos.AviVtaCod
INNER JOIN DetAuto ON Avisos.AviVtaCod = DetAuto.DetAutCod
INNER JOIN AUTMAR ON DetAuto.DetAutMarC = AUTMAR.AutMarCod
AND DetAuto.DetAutTpoC = AUTMAR.AutTpoCod
INNER JOIN AUTMOD ON DetAuto.DetAutMarC = AUTMOD.AutMarCod
AND DetAuto.DetAutTpoC = AUTMOD.AutTpoCod
AND DetAuto.DetAutModC = AUTMOD.AutModCod
INNER JOIN AUTTPO ON AUTMOD.AutTpoCod = AUTTPO.AutTpoCod '
set @ClausulaWhere = '(Avisos.AviSbpCod <> 5) and (Avisos.AviSbpCod <> 3) and (DetAutTpoC = ' + convert(varchar(10),@Tipo) + ')'

set @SentenciaSELECT = 'SET NOCOUNT ON;'
set @SentenciaSELECT = @SentenciaSELECT + 'SELECT ' + @ColumnasSalida
set @SentenciaSELECT = @SentenciaSELECT + @Order
set @SentenciaSELECT = @SentenciaSELECT + ' INTO #Results '
set @SentenciaSELECT = @SentenciaSELECT + 'FROM ' + @ClausulaFrom
set @SentenciaSELECT = @SentenciaSELECT + 'WHERE ' + @ClausulaWhere + ';'
set @SentenciaSELECT = @SentenciaSELECT + 'SELECT COUNT(*) as RecordCount into #CantidadRegistros FROM #Results;'
set @SentenciaSELECT = @SentenciaSELECT + 'SELECT Reg.RecordCount as CanReg, Resultado.* FROM #Results Resultado CROSS JOIN #CantidadRegistros Reg WHERE RowNumber BETWEEN ' + convert(varchar(10),((@PageIndex -1) * @PageSize + 1)) + ' AND ' + convert(varchar(10),((@PageIndex -1) * @PageSize + 1) + @PageSize - 1) + ';'
set @SentenciaSELECT = @SentenciaSELECT + 'DROP TABLE #Results; DROP TABLE #CantidadRegistros;'

execute(@SentenciaSELECT)

END
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #16 (permalink)  
Antiguo 22/08/2011, 10:29
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

olvidate del exec(cadena) y cambialo por EXEC SP_EXECUTESQL @MyNVarchar
__________________
MCTS Isaias Islas
  #17 (permalink)  
Antiguo 22/08/2011, 10:34
Avatar de mdavila  
Fecha de Ingreso: julio-2007
Ubicación: Montevideo (Uruguay)
Mensajes: 919
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: transact STORE PROCEDURE

Cual es la diferencia?

Cita:
Iniciado por iislas Ver Mensaje
olvidate del exec(cadena) y cambialo por EXEC SP_EXECUTESQL @MyNVarchar
__________________
Marcelo Davila.

:. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.
  #18 (permalink)  
Antiguo 22/08/2011, 12:25
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: transact STORE PROCEDURE

Bueno, lee tu ayuda en linea y veras las diferencias que hay:

http://msdn.microsoft.com/es-es/library/ms188001.aspx
__________________
MCTS Isaias Islas

Etiquetas: procedure, store
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 14:53.