Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Procedimiento almacenado pasando como parametro el nombre de la base (https://www.clubdelphi.com/foros/showthread.php?t=89116)

aromigaret 29-09-2015 02:49:34

Procedimiento almacenado pasando como parametro el nombre de la base
 
Hola, estoy intentando realizar la suma de varios campos con procedimientos almacenados en sql server 2008. El inconveniente radica en que no hayo la forma de hacerlo al pasarle a dicho procedimiento como parametro la base sobre la cual tiene que realizar las suma. Les paso lo realizado:

ALTER PROCEDURE [dbo].[TOTALES]
-- Add the parameters for the stored procedure here

@TOTIVA21 NUMERIC(13,2) OUTPUT,
@TOTIVA105 NUMERIC(13,2) OUTPUT,
@SUBTsIVA NUMERIC(13,2) OUTPUT,
@GANANCIAsIVA NUMERIC(13,2) OUTPUT,
@GANANCIAcIVA NUMERIC(13,2) OUTPUT,
@BASE NVARCHAR(9)

AS
BEGIN

DECLARE @COMANDO NVARCHAR(240)
SET NOCOUNT ON;

SET @COMANDO='SELECT (@TOTIVA105)= SUM(SUBTIVA105) FROM ' + @BASE
EXEC SP_EXECUTESQL @COMANDO

SET @COMANDO= 'SELECT @TOTIVA21=SUM(SUBTIVA21) FROM ' + @BASE
EXEC SP_EXECUTESQL @COMANDO

SET @COMANDO= 'SELECT @SUBTsIVA=SUM(SUBTOTSIVA) FROM ' + @BASE
EXEC SP_EXECUTESQL @COMANDO

SET @COMANDO= 'SELECT @GANANCIAsIVA=SUM(GANASIVA) FROM ' + @BASE
EXEC SP_EXECUTESQL @COMANDO

SET @COMANDO= 'SELECT @GANANCIAcIVA=SUM(GANACIVA) FROM ' + @BASE
EXEC SP_EXECUTESQL @COMANDO

END

Agradezco de antemano quien pueda ayudarme

Casimiro Notevi 29-09-2015 09:32:16

Recuerda poner los tags al código fuente, ejemplo:


orodriguezca 29-09-2015 21:16:02

Quizas esto funcione, no lo he probado:

Código SQL [-]
ALTER PROCEDURE [dbo].[TOTALES]
-- Add the parameters for the stored procedure here

@TOTIVA21 NUMERIC(13,2) OUTPUT,
@TOTIVA105 NUMERIC(13,2) OUTPUT,
@SUBTsIVA NUMERIC(13,2) OUTPUT,
@GANANCIAsIVA NUMERIC(13,2) OUTPUT,
@GANANCIAcIVA NUMERIC(13,2) OUTPUT,
@BASE NVARCHAR(9)

AS
BEGIN

  DECLARE @COMANDO NVARCHAR(1000) 
  SET NOCOUNT ON;


  set @COMANDO = 
    'select ' + 
    '  SUM(SUBTIVA105) as SUBTIVA105 , ' + 
    '  SUM(SUBTIVA21)  as SUBTIVA21 , ' + 
    '  SUM(SUBTOTSIVA) as SUBTOTSIVA, ' + 
    '  SUM(GANASIVA) as GANASIVA, ' + 
    ' SUM(GANACIVA)  as GANACIVA ' +
    ' into #tempo1 ' +
    ' from ' + @BASE;

  EXEC SP_EXECUTESQL @COMANDO;

  select top 1
    @TOTIVA105 = SUBTIVA105, 
    @TOTIVA21 = TOTIVA21, 
    @SUBTsIVA = SUBTOTSIVA, 
    @GANANCIAsIVA = GANASIVA, 
    @GANANCIAcIVA = GANACIVA
  from #tempo1;

END

aromigaret 30-09-2015 04:01:47

Estimado orodriguezca, gracias por tu tiempo. Probe lo que me enviaste y obtengo al llamarlo desde delphi "el nombre de objeto #tempo1 no es valido'. Lo he modificado de varias maneras y simepre da ese error. Tomando tu ejemplo lo hice con variable de tabla

Código SQL [-]
ALTER PROCEDURE [dbo].[TOTALES]
    -- Add the parameters for the stored procedure here
    
    @TOTIVA21 NUMERIC(13,2) OUTPUT,
    @TOTIVA105 NUMERIC(13,2) OUTPUT,
    @SUBTsIVA NUMERIC(13,2) OUTPUT,
    @GANANCIAsIVA NUMERIC(13,2) OUTPUT,
    @GANANCIAcIVA NUMERIC(13,2) OUTPUT,
    @BASE NVARCHAR(9)
    
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
  DECLARE @COMANDO NVARCHAR(1000)   
  DECLARE @TEMP1 TABLE(SUBTIVA105 NUMERIC(11,2),SUBTIVA21 NUMERIC(11,2),SUBTOTSIVA NUMERIC(11,2),GANASIVA NUMERIC(11,2),GANACIVA NUMERIC(11,2))
  
  SET NOCOUNT ON;  
  
  SET @COMANDO = 
    'INSERT INTO @TEMP1' + 
    ' SELECT ' + 
    ' SUM(SUBTIVA105), ' + 
    ' SUM(SUBTIVA21) , ' + 
    ' SUM(SUBTOTSIVA), ' + 
    ' SUM(GANASIVA) , ' + 
    ' SUM(GANACIVA) ' +    
    ' from ' + @BASE;

  EXEC SP_EXECUTESQL @COMANDO;

  select top 1
    @TOTIVA105 = SUBTIVA105, 
    @TOTIVA21 = SUBTIVA21, 
    @SUBTsIVA = SUBTOTSIVA, 
    @GANANCIAsIVA = GANASIVA, 
    @GANANCIAcIVA = GANACIVA
  from @temp1;


pero me da error cuando se ejecuta el @comando "debe declarar la varible de tabla @temp1". Es como si no reconociera las variables que estan dentro del @comando

fjcg02 30-09-2015 08:37:12

Hola,
El problema es de alcance de las variables. Cuando se ejecutan en el XEC SP_EXECUTESQL, no existen en su ámbito ( ya que el SQL Server seguramente creará uno nuevo) . Creo que eso es lo que está ocurriendo.

Prueba a hacer:

SELECT @TOTIVA105= SUM(SUBTIVA105) FROM @BASE

a ver si te deja el valor en la variable @TOTIVA105.
No estoy seguro de que funcione.

Otra cosa que me llama la atención es ( no estoy seguro) si las variables de entrada pueden ser cambiadas. Si no se pudiera, tendrás que definir otras.

Un saludo

aromigaret 30-09-2015 16:13:22

Gracias fjcg02 por tu aporte para entender porque no tomaba la variable en el execute. Lo que me aconsejas fue lo primero que hice y funciona perfecto cuando pongo un nombre de tabla, entonces como necesito hacerlo para varias tablas, cambié el nombre de tabla por la variable "@BASE y me llevé la sorpresa que al guardar el procedimiento aparece "Debe declarar la variable de tabla "@BASE"", la cual está declarada. Por eso intenté con el execute, pero tampoco funciona.

fjcg02 30-09-2015 16:42:19

Hola,
puedes hacer otra cosa.

Lo que te propone aromigaret está bien, pero te pasará lo mismo por el ámbito de las variables, aparte de que sería
SET @COMANDO =
'INSERT INTO '+@TEMP1 +
' SELECT ' +
' SUM(SUBTIVA105), ' +
' SUM(SUBTIVA21) , ' +
' SUM(SUBTOTSIVA), ' +
' SUM(GANASIVA) , ' +
' SUM(GANACIVA) ' +
' from ' + @BASE;

Puedes declarar en vez de una variable de tipo tabla @TEMP1 una tabla que te haga el trabajo.

Para ello deberás hacer algo así
CREATE TABLE #TEMP1 (SUBTIVA105 NUMERIC(11,2),SUBTIVA21 NUMERIC(11,2),SUBTOTSIVA NUMERIC(11,2),GANASIVA NUMERIC(11,2),GANACIVA NUMERIC(11,2))

para crearla, luego usarla haciendo los insert y finalmente borrarla.

DROP TABLE #TEMP1

Estas tablas sólo las ve no estoy seguro si la sesión activa o el usuario, pero no debes olvidar borrarla al final del proceso.

Prueba a ver si consigues algo.

Saludos

aromigaret 30-09-2015 18:05:43

fjcg02, gracias nuevamente. Hay un detalle que no me queda claro, si utilizo una tabla temporal, como me lo propones, y mas de un usuario utiliza este procedimiento, no daría error, pues todos crearían la misma tabla auxiliar?. Para que comprendas, este procedimiento suma distintas columnas de una tabla que se crea temporalmente. En ella se cargan pedidos para realizar una factura. Como a veces son muchos ítems, si lo hacia dentro del programa tardaba considerablemente, al hacerlo por procedimiento almacenados y probarlo con una tabla temporal especifica, funcionaba perfecto, lo quise "generalizar" para realizar la carga de pedidos desde varias terminales y allí es donde no logro hacerlo funcionar.

fjcg02 30-09-2015 21:19:08

Tengo entendido que las tablas temporales se crean en el ámbito de la sesión del usuario. Es decir, una tabla creada por un usuario en una sesión no puede ser utilizada por incluso el mismo usuario en otra sesión.

De hecho, si cierras la sesión del usuario sin borrar la tabla, y la vuelves a abrir, la tabla ya no existe. Ahora bien, si no la borras , y en la misma sesión vuelves a crearla, el motor te levantará una excepción.

Hay documentación en la red que lo explica bastante mejor que yo.

En le trabajo tengo un montón de consultas de extracción de información que ejecuto con el mismo usuario, obviamente en distintas sesiones, y no me ha cascado nunca por este motivo. También he de confesarte que cambié las tablas temporales por variables de tipo tabla, que para tablas de "pocos" registros me resultan más prácticas y son más rápidas.

Cuando he utilizado tablas, me ha cascado cuando la sql casca por algún error de sintaxis, valor en alguna variable, etc y no pasa por la instrucción de borrado de la tabla.

Espero haberte ayudado.

Un saludo

aromigaret 01-10-2015 02:59:22

No hay caso fjcg02...

si lo hago asi :

Código SQL [-]
CREATE TABLE #TEMP1 (SUBTIVA105 NUMERIC(11,2),SUBTIVA21 NUMERIC(11,2),SUBTOTSIVA NUMERIC(11,2),GANASIVA NUMERIC(11,2),GANACIVA NUMERIC(11,2))
    
  INSERT INTO #TEMP1 SELECT SUM(SUBTIVA105) , SUM(SUBTIVA21) , SUM(SUBTOTSIVA), SUM(GANASIVA) , SUM(GANACIVA) from @BASE

siendo @base=varchar(9) (donde paso como parametro el nombre de la base), el error es ' Debe declarar la variable de tabla "@BASE" '.


si lo hago asi....

Código SQL [-]
DECLARE @COMANDO NVARCHAR(1000)   
  create table #TEMP1(SUBTIVA105 NUMERIC(11,2),SUBTIVA21 NUMERIC(11,2),SUBTOTSIVA NUMERIC(11,2),GANASIVA NUMERIC(11,2),GANACIVA NUMERIC(11,2))
  
  SET NOCOUNT ON;  
  
  SET @COMANDO = 
    'INSERT INTO ' + #TEMP1 + 
    ' SELECT ' + 
    ' SUM(SUBTIVA105), ' + 
    ' SUM(SUBTIVA21) , ' + 
    ' SUM(SUBTOTSIVA), ' + 
    ' SUM(GANASIVA) , ' + 
    ' SUM(GANACIVA) ' +    
    ' from ' + @BASE;

  EXEC SP_EXECUTESQL @COMANDO;

el error es " El nombre de columna '#TEMP1' no es válido" para #TEMP1 y si pongo @TEMP1 el error es ' Debe declarar la variable escalar "@TEMP1" '

No se por donde encaralo..

fjcg02 01-10-2015 09:21:39

Hola,
no tengo posibilidad de probar, ya que no administro ninguna bbdd de SQL Server.

Lo que sí te puedo asegurar es que se pueden hacer queries bastante complejas que devuelvan lo que quieras.

Por todo lo dicho te recomiendo que hagas un consulta que haga lo siguiente:

Código SQL [-]
create table #tablatemp (
campo1 varchar(20)
)

declare @tabla as varchar(20)

set @tabla ='tabla1'

execute ( 'insert into #tablatemp'+
              ' select campo from '+@tabla +
              ' where condicion '
            )

set @tabla ='tabla2'

execute ( 'insert into #tablatemp'+
              ' select campo from '+@tabla +
              ' where condicion '
            )

select * from #tablatemp

drop table #tablatemp
Esto funciona. Devuelve filas y columnas.
Adapta tus consultas, tus campos, ... y nos dices qué resultado te da.

Saludos

aromigaret 02-10-2015 00:41:13

Genioooooo!!!!! Funcionó !!!!

Fjcg02, no tengo palabras para agradecerte, muchas gracias por tu tiempo y dedicacion.

Aqui dejo el proceso por si alguien necesita algo parecido.

Código SQL [-]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        
-- Create date: <Create Date,,>
-- Description:    
-- =============================================
ALTER PROCEDURE [dbo].[TOTALES]
    -- Add the parameters for the stored procedure here
    
    @BASE NVARCHAR(9),
    @TOTIVA21 NUMERIC(13,2) OUTPUT,
    @TOTIVA105 NUMERIC(13,2) OUTPUT,
    @SUBTsIVA NUMERIC(13,2) OUTPUT,
    @GANANCIAsIVA NUMERIC(13,2) OUTPUT,
    @GANANCIAcIVA NUMERIC(13,2) OUTPUT
    
    
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
  DECLARE @COMANDO NVARCHAR(1000)   
  CREATE TABLE #TEMP1 (SUBTIVA105 NUMERIC(11,2),SUBTIVA21 NUMERIC(11,2),SUBTOTSIVA NUMERIC(11,2),GANASIVA NUMERIC(11,2),GANACIVA NUMERIC(11,2))
   
    
  SET NOCOUNT ON;  
  
  EXECUTE ('INSERT INTO #TEMP1 ' + 
    ' SELECT ' + 
    ' SUM(SUBTIVA105), ' + 
    ' SUM(SUBTIVA21) , ' + 
    ' SUM(SUBTOTSIVA), ' + 
    ' SUM(GANASIVA) , ' + 
    ' SUM(GANACIVA) ' +    
    ' from ' + @BASE)

  select top 1
    @TOTIVA105 = SUBTIVA105, 
    @TOTIVA21 = SUBTIVA21, 
    @SUBTsIVA = SUBTOTSIVA, 
    @GANANCIAsIVA = GANASIVA, 
    @GANANCIAcIVA = GANACIVA
  from #TEMP1;    
    
END


Merito total a Fjcg02

fjcg02 02-10-2015 09:29:48

Gracias aromigaret!

No es tan grande el merito.

Gracias también por compartir tu código para que otra persona en el mismo caso pueda utilizarlo para su análisis y estudio.

Un saludo


La franja horaria es GMT +2. Ahora son las 11:17:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi