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

@Local Variables + Create Tables

Estas en el tema de @Local Variables + Create Tables en el foro de Bases de Datos General en Foros del Web. Hola amigos... como estan? Les cuento: se trata de Un Stored Procedure en SQL-Server 2000 Lo que estoy haciendo es un formulario de alta de ...
  #1 (permalink)  
Antiguo 10/06/2003, 09:28
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
@Local Variables + Create Tables

Hola amigos... como estan?

Les cuento: se trata de Un Stored Procedure en SQL-Server 2000

Lo que estoy haciendo es un formulario de alta de datos en ASP.
Cuando un usuario ingresa al sistema con su "Nombre de Usuario"... se genera automticamente con este... el nombre de una tabla temporal y se guarda en una variable....

Por ejemplo... TempTable = "temp_" + session("name")
que seria: TempTable = "temp_GONZALEZ"

una ves que esta lleno el formulario... envio los datos como parametros al StoredProcedure y tambien envio el nombre de la tabla que quiero crear.

Por ejemplo:
Desde ASP envio ...

strSQL = "sp_CheckSave " & Fechach & "," & TempTable
Set objRS = OpenConnection.Execute(strSQL)

En el Stored Procedure sp_CheckSave tengo esto:
Código:
CREATE PROCEDURE sp_CheckSave
--Estos son los parametros que paso desde ASP
@Fechach CHAR(8),
--Nombre de tabla temporal determinado desde ASP (temp_GONZALEZ)
@TempTable CHAR(30),

AS

SET NOCOUNT ON

if @TempTable is not null
Begin
                --ACA ME DA ERROR
	Create Table @TempTable (
		Fechach CHAR(8),
		Numeroch CHAR(10),
		Expte NUMERIC(9),
		Decreto NUMERIC(9),
		Coddecr NUMERIC(9) ,
		Codestab NUMERIC(9),
		Importe NUMERIC(9),
		Partida NUMERIC(9),
		Jurisdicc NUMERIC(9),
		Mes NUMERIC(9),
		Anio NUMERIC(9),
		Estado NUMERIC(9),
		Institu CHAR(1),
	)
	INSERT INTO @TempTable (Fechach) VALUES(@Fechach)

End
GO
Yo quiero que esa tabla (TempTable) se cree de forma FISICA en el SQL... no quiero que sea temporal... (ya que se podria crear con #TempTable pero no es lo que quiero)
O sea... a pesar de que se llama temporal quiero que se cree de forma definitiva... no se si soy claro.

Pero... Por que no me deja crear una tabla con el nombre del parametro que paso desde ASP???... que solucion me dan???

desde ya muchas gracias y disculpen por mi falta de conocimiento en sql server.
__________________
tech-nico.com
  #2 (permalink)  
Antiguo 10/06/2003, 09:53
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 4 meses
Puntos: 11
esto es por que en SQL no podes evaluar las variables de esa forma, solucion:


SET NOCOUNT ON
if @TempTable is not null
Begin
declare @cComando as nVarchar(1000)
select @cComando ='drop table '+@TempTable
exec sp_sqlexec @cComando
go
select @cComando ='Create Table '+@TempTable+' (Fechach CHAR(8), Numeroch CHAR(10),Expte NUMERIC(9),Decreto NUMERIC(9),Coddecr NUMERIC(9) ,Codestab NUMERIC(9),Importe NUMERIC(9),Partida NUMERIC(9),Jurisdicc NUMERIC(9),Mes NUMERIC(9),Anio NUMERIC(9),Estado NUMERIC(9),Institu CHAR(1),)'

exec sp_sqlexec @cComando
Go
select @cComando = 'INSERT INTO '+@TempTable+' (Fechach) VALUES('+@Fechach+')'

exec sp_sqlexec @cComando
End
GO

Solo una nota, en este caso yo elimino la tabla antes de crearla, si tienes que tener en cuenta, que antes debes averiguar si ya existe la tabla para no volverla a crear.


Saludos.
__________________
Jorge Mota
Blog
Gubiz estafa
  #3 (permalink)  
Antiguo 10/06/2003, 10:49
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
Hola Jorge sos un Master!!!!!!
CAPO!!
Solo una cositas mas!....

¿Puede ser que los "Go" que estan seguidamente despues de cada exec "No Vayan" ??
Y que vaya solo el ultimo?

Mil Gracias.
__________________
tech-nico.com
  #4 (permalink)  
Antiguo 10/06/2003, 12:21
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 4 meses
Puntos: 11
deja los Go, pues, si digamos, eliminas una tabla
no la puedes crear, ya que Sql no ha terminado de ejecutar
el query, por lo tanto es como si aun existiera, el Go
le indica, que al llegar alli, ejecute todo lo anterior.

revisa la ayuda del SQL Server con respecto a Ejecucion en Lotes
y el comando Go.

(y de nada)
__________________
Jorge Mota
Blog
Gubiz estafa
  #5 (permalink)  
Antiguo 11/06/2003, 16:57
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
Jorge!... de nuevo yo!

te cuento... con respecto a lo que me has ayudado... "anda practicamente de maravilla"... solo que me tira un pequeño error de datos....
Código:
Microsoft OLE DB Provider for ODBC Drivers error '80040e57' 

[Microsoft][ODBC SQL Server Driver][SQL Server]Arithmetic overflow error converting varchar to data type numeric. 

/USR/abm.asp, line 29
Creo que es el Insert... puede ser?
Porque crea la tabla... pero cuando la abris esta vacia... o sea que no llega a grabar...
que opinas Jorge?

Gracias de antemano!

______________________________
VOLVI!
que puede ser jorge?? es raro...
estuve buscando bastante sobre el error...

tambien lo tengo en español:
Código:
[Microsoft][ODBC SQL Server Driver][SQL Server]Error de desbordamiento aritmético al convertir varchar al tipo de datos numeric.
Lo busque en google pero no encontre mucho.

Jorge?? are u there?

Ayudita plissss!!
__________________
tech-nico.com

Última edición por OXIGENO; 11/06/2003 a las 16:57
  #6 (permalink)  
Antiguo 13/06/2003, 11:59
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 4 meses
Puntos: 11
tienes que convertir la fecha a formato caracter antes de mandar el insert
__________________
Jorge Mota
Blog
Gubiz estafa
  #7 (permalink)  
Antiguo 17/06/2003, 05:58
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
Gracias Jorge.... Perdon por la demora!
__________________
tech-nico.com
  #8 (permalink)  
Antiguo 17/06/2003, 06:12
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
Eso ya lo solucione!...
Tengo mas preguntas!!
Como tengo que definir los parametros que envio desde ASP al stored procedure??.... Como tengo que tratar los datos dentro del stored?
Y digo esto porque no se que estoy haciendo mal pero me toma todo y absolutamente todo como si fuera numerico...
Por Ejemplo:

--Estos son los parametros que paso desde ASP
@Numeroch CHAR(10),
@Expte VARCHAR(8)

Si en @Numeroch ingreso caracteres me da error... pero si ingreso nros no!.... y me sucede lo mismo con todos los campos que quiero manipular como tipos de datos CHAR.
Pero el error me lo da en el Stored ya que lo porbe desde el query analizer simulando algunos datos como ejemplo y no hubo caso.
Creo que el error es en un Insert.

Que puede ser?
__________________
tech-nico.com
  #9 (permalink)  
Antiguo 17/06/2003, 09:12
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
El error que me pone es este:
Código:
El nombre 'XX' no es válido en este contexto. Sólo se permiten constantes, expresiones o variables. No se permiten nombres de columna.
__________________
tech-nico.com
  #10 (permalink)  
Antiguo 17/06/2003, 10:32
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 4 meses
Puntos: 11
pon todo el codigo de tu sp aca.
y marca la linea que te da error.
__________________
Jorge Mota
Blog
Gubiz estafa
  #11 (permalink)  
Antiguo 18/06/2003, 06:30
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
Jorge aca te dejo el sp para que veas si puedes darme una mano...


Código:
--Declaro Datos que vienen de ASP
DECLARE @Fechach VARCHAR,
@Numeroch CHAR,
@Expte VARCHAR(8),
@Decreto VARCHAR(8),
@Coddecr VARCHAR(8),
@Codestab VARCHAR(8),
@Importe VARCHAR(8),
@Partida VARCHAR(8),
@Jurisdicc VARCHAR(8),
@Mes VARCHAR(8),
@Anio VARCHAR(8),
@Estado VARCHAR(8),
@Institu CHAR,
@TempTable CHAR(30)

----------------------------------------------------------------------------
---vamos a simular los datos que vienen de ASP
SELECT @Fechach = '12/12/02'
SELECT @Numeroch = 'SS'
SELECT @Expte = 1
SELECT @Decreto = 1
SELECT @Coddecr = 1
SELECT @Codestab = 2
SELECT @Importe = 1
SELECT @Partida = 1
SELECT @Jurisdicc = 1
SELECT @Mes = 1
SELECT @Anio = 1
SELECT @Estado = 1
SELECT @Institu = 'x'
SELECT @TempTable = 'temp_PEREZ'


SET NOCOUNT ON

DECLARE @STATUS CHAR(200)
DECLARE @cComando AS NVARCHAR(1000)
-- SI NO EXISTE EL CODIGO DE JURISDICCION DEL FORM
IF EXISTS(SELECT * FROM LOCALIDA WHERE CODIGOCIUD = @Codestab AND CODIGOCIUD IS NOT NULL) BEGIN
	IF @TempTable IS NOT NULL BEGIN
		--SI EXISTE VERIFICO QUE NO ESTE VACIA
		IF EXISTS(SELECT * FROM sysobjects WHERE NAME =  @TempTable) BEGIN
			--SI EXISTE PERO TIENE REGISTROS VACIOS LOS BORRO
			SELECT @cComando = 'IF EXISTS (SELECT COUNT(*), FECHACH FROM ' + @TempTable + 
						           		   ' WHERE FECHACH IS NULL GROUP BY FECHACH) BEGIN 
								DELETE FROM '+@TempTable +
				                         ' END'
			EXEC sp_sqlexec @cComando
			--SI EL COD YA NO ESTA EN LA TEMPORAL LO INSERTO
			SELECT @cComando = 'IF NOT EXISTS (SELECT * FROM ' + @TempTable + ' WHERE CODESTAB ='  + @Codestab+ ') BEGIN 
							INSERT INTO '+@TempTable+' (Fechach,Numeroch,Expte,Decreto,Coddecr,Codestab,Importe,Partida,Jurisdicc,Mes,Anio,Estado,Institu) VALUES('+ CAST(@Fechach AS CHAR)+','+CAST(@Numeroch AS CHAR)+','+@Expte+','+@Decreto+','+@Coddecr+','+@Codestab+','+@Importe+','+@Partida+','+@Jurisdicc+','+@Mes+','+@Anio+','+@Estado+','+@Institu+') 
							SELECT * FROM '+@TempTable+
				          ' END
				           ELSE BEGIN
						SELECT * FROM '+@TempTable+
				          ' END'
			EXEC sp_sqlexec @cComando
		END
		ELSE BEGIN
			--SI NO EXISTE LA CREO
			SELECT @cComando ='Create Table '+@TempTable+' (Fechach DATETIME, Numeroch CHAR(10),Expte NUMERIC(9),Decreto NUMERIC(9),Coddecr NUMERIC(9) ,Codestab NUMERIC(9),Importe NUMERIC(9),Partida NUMERIC(9),Jurisdicc NUMERIC(9),Mes NUMERIC(9),Anio NUMERIC(9),Estado NUMERIC(9),Institu CHAR(1))'
			EXEC sp_sqlexec @cComando
			SELECT @cComando = 'INSERT INTO '+@TempTable+' (Fechach,Numeroch,Expte,Decreto,Coddecr,Codestab,Importe,Partida,Jurisdicc,Mes,Anio,Estado,Institu) VALUES('+@Fechach+','+@Numeroch+','+@Expte+','+@Decreto+','+@Coddecr+','+@Codestab+','+@Importe+','+@Partida+','+@Jurisdicc+','+@Mes+','+@Anio+','+@Estado+','+@Institu+') 
					    SELECT * FROM '+@TempTable
			EXEC sp_sqlexec @cComando
		END
	END
	ELSE BEGIN
		SELECT @STATUS = 'EL NOMBRE DE LA TABLA ES NULO.-'
		SELECT @STATUS
	END
END
ELSE  BEGIN
	SELECT @STATUS = 'NO EXISTE CODESTABL.-'
	SELECT @STATUS
END
GO
El error que me tal cual esta el codigo es este:
Código:
Server: Msg 128, Level 15, State 1, Line 1 
The name 'S' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted.
Aclaro: veras que en el insert he probado convertir los datos con CAST pero igual no funciono.

Sigo probando...
el problema esta simplemente en el uso del SP sp_sqlexec,
ya que comprobe que quitando este y reemplazando
las variables por valores reales anda perfecto...
Aca esta el drama:
Código:
DECLARE @Fechach DATETIME,@Numeroch char(50),@Expte VARCHAR(8),@Decreto VARCHAR(8),@Coddecr VARCHAR(8),@Codestab VARCHAR(8),@Importe VARCHAR(8),@Partida VARCHAR(8),@Jurisdicc VARCHAR(8),@Mes VARCHAR(8),@Anio VARCHAR(8),@Estado VARCHAR(8),@Institu CHAR,@TempTable CHAR(30)
SELECT @Fechach = '12/12/02'
SELECT @Numeroch = 'L'
SELECT @Expte = 1
SELECT @Decreto = 1
SELECT @Coddecr = 1
SELECT @Codestab = 2
SELECT @Importe = 1
SELECT @Partida = 1
SELECT @Jurisdicc = 1
SELECT @Mes = 1
SELECT @Anio = 1
SELECT @Estado = 1
SELECT @Institu = 'x'
select @TempTable = 'temp_PEREZ'
DECLARE @cComando NVARCHAR(1000)
SELECT @cComando = 'INSERT INTO '+ @TempTable+ '(Fechach,Numeroch,Expte,Decreto,Coddecr,Codestab,Importe,Partida,Jurisdicc,Mes,Anio,Estado,Institu) VALUES(''+@Fechach+'',''+@Numeroch+'','+@Expte+','+@Decreto+','+@Coddecr+','+@Codestab+','+@Importe+','+@Partida+','+@Jurisdicc+','+@Mes+','+@Anio+','+@Estado+','+@Institu+')' 
EXEC sp_sqlexec @cComando
__________________
tech-nico.com

Última edición por OXIGENO; 18/06/2003 a las 06:30
  #12 (permalink)  
Antiguo 18/06/2003, 11:22
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 4 meses
Puntos: 11
ya vi cual es tu problema
el problema viene dado, por varias razones.
uno, al hacer Select @cComando='Insert into...'tienes

VALUES('+ CAST(@Fechach AS CHAR)+','+CAST(@Numeroch AS CHAR)+','+@Expte+','+@Decreto+','+@Coddecr+','+@Co
destab+','+@Importe+','+@Partida+','+@Jurisdicc+',
'+@Mes+','+@Anio+','+@Estado+','+@Institu+')

lo cual queda como
Values(01/01/2002,ss,.... etc
y para que funcione debes encerrar entre '' los valores
el problema es que en SQL el ' es para abrir cadena y cerrar, como
metemos una ' dentro de una cadena ?

aca va la solucion

Set Quoted_Identifier off
ponlo al inicio del SP, esto le indica a SQL que el texto que encierres entre " " (comillas dobles) es una cadena, de lo contrario dara error.

asi que a cambiar lo siguiente:
agregar al inico
Set Quoted_Identifier off
define @Fechach
lo tienes como char y por eso solo te toma un caracter
Ponlo Asi:
DECLARE @Fechach CHAR(20)

el primer Select @cComando queda Asi:
SELECT @cComando = "IF NOT EXISTS (SELECT * FROM " + @TempTable + "WHERE CODESTAB ='" + @Codestab+ "') BEGIN "+
"INSERT INTO "+@TempTable+" (Fechach,Numeroch,Expte,Decreto,Coddecr,Codestab,I mporte,Partida,Jurisdicc,Mes,Anio,Estado,Institu) VALUES('"+ CAST(@Fechach AS nvarchar)+"','"+CAST(@Numeroch AS CHAR)+"','"+@Expte+"','"+@Decreto+"','"+@Coddecr+" ','"+@Codestab+"','"+@Importe+"','"+@Partida+"','" +@Jurisdicc+"','"+@Mes+"','"+@Anio+"','"+@Estado+" ','"+@Institu+"') SELECT * FROM "+@TempTable+ " END ELSE BEGIN SELECT * FROM "+@TempTable+" END"

el segundo asi:
SELECT @cComando = "INSERT INTO "+@TempTable+" (Fechach,Numeroch,Expte,Decreto,Coddecr,Codestab,I mporte,Partida,Jurisdicc,Mes,Anio,Estado,Institu) VALUES('"+@Fechach+"','"+@Numeroch+"','"+@Expte+"' ,'"+@Decreto+"','"+@Coddecr+"','"+@Codestab+"','"+ @Importe+"','"+@Partida+"','"+@Jurisdicc+"','"+@Me s+"','"+@Anio+"','"+@Estado+"','"+@Institu+"') SELECT * FROM "+@TempTable

(estos son los del insert, los del create table estan bien)

Saludos.
__________________
Jorge Mota
Blog
Gubiz estafa

Última edición por Jorge_Mota; 18/06/2003 a las 11:26
  #13 (permalink)  
Antiguo 18/06/2003, 12:30
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 2 meses
Puntos: 2
Jorge! Sos un grande!!! asi te lo digo!!!
MASTER!!!!!
Anda PER FEC TO!!!
Muchas gracias!
__________________
tech-nico.com
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 03:48.