La palabra comilla y la variable se resuelven en la
sentencia, por ejemplo si tiene un WHERE de una variable alfa debes
colocar WHERE @SITUAC = 'ALGO' la primera comilla la resuelvo con la
palabra comilla lo mismo que la ultima y no quedan como un literal
Jaime Villa T.
----- Mensaje original -----
Enviado: Jueves, 24 de Febrero de 2005
02:59 a.m.
Asunto: Re: Sql dinamico
Pero @situac y @categoria son
dos variables y si les pongo comillas me los coje como literal
el eval lo realizaria asi C
EVAL
Seletq= 'select arcodi, arnomb, - C
from fartic - C
where
arempr=:@empresa and arsitu=:@situac - C
and arcate=:@categoria'
dcomilla s
1 inz('''')
c
eval selectq = 'select arcodi, arnomb '
+ c
'from fartic '
+ c
'where
arempr = ' +
c
@empresa +
c
' and arsitu = ' + c
comilla + c
@situac +
c
comilla
+ c
'and arcate = ' +
c
comilla + c
@categoria + c
comilla
c Esta
sentencia es completamente dinámica
Jaime Villa T. ----- Mensaje
original ----- De: Fernando
Pérez Para:
forum.help400@combios.es
Enviado: Miércoles, 23 de Febrero de 2005 05:27
a.m. Asunto: Re: Sql dinamico
[EMAIL PROTECTED] escribió:
Hola Foro. Estoy haciendo una
prueba para trabajar con SQL dinamico y no hay manera, a ver si me podeis
echar una mano. En principio no hace la seleccion y el SQLCOD = -514 Os
paso el pequeńo programa de pruebas. Compilo con commit *none . hasta que no
hemos pasado a V5r3 no he podido hacer nada con sql embebido y esta prueba es
basándome en ejemplos que habeis enviado al Foro. La misma seleccion en
estático funciona bien.
FFartic IF E
k disk FProvartic O a E
disk D @empresa
S 3
0 Inz(10) D @situac S
1
Inz('A') D @categoria S
2 Inz('BR')
D Seletq S
300 * C
EVAL
Seletq= 'select arcodi, arnomb, - C
from fartic - C
where
arempr=:@empresa and arsitu=:@situac - C
and arcate=:@categoria'
Ŕ C/Exec sql
Ŕ C+ PREPARE
stmt FROM :seletQ C/end-exec
Ŕ *
Ŕ C/EXEC SQL
Ŕ C+ DECLARE C1 CURSOR FOR
Stmt C/END-EXEC
Ŕ *
Ŕ C/Exec sql
Ŕ C+ open C1
Ŕ C/end-exec
Ŕ *
Ŕ Ŕ C
Dow
sqlcod <>100 and sqlcod>=0
ŔŻ---------------1-. C/Exec sql
Ŕ
| C+
FETCH NEXT FROM C1 INTO :prcodi, :prnomb C/end-exec
Ŕ
| Ŕ C
If
sqlcod<>100 and sqlcod>=0
ŔŻ-------------2-. |
C Write
Provesr
Ŕ
| | Ŕ C
Endif
Ŕ®-------------2-' | Ŕ C
Enddo
Ŕ®---------------1-' C/Exec sql
Ŕ C+ CLOSE
C1 C/end-exec
Ŕ C
Seton
Lr Ŕ
No puedes emplear variables del lenguaje de esa forma en sql
dinámico. En su lugar, utiliza el valor de éstas mismas variables en la
sentencia, o bien prepara una sentencia con parámetros (por ejemplo, 'where
arempr = ? '), y luego ejecútala pasándole dichos parámetros (creo recordar
que para un cursor sería 'declare c1 cursor for stmt using
:variable')
-- Saludos.
Fernando Pérez
Cerámica Saloni. Dpto. Sistemas
|