Sp_executesql problema con decimales
Publicado por Ricardo (7 intervenciones) el 28/01/2008 17:19:12
Anexo el procedimiento almacenado donde tengo un problema en todos los insert, ya que no permite insertar valores con decimales, espero me puedan ayudar.
Desde el servidor descargo las actualizaciones para mis catologos.
ejemplo de esta tabla
en el server los valores estan:
margenInf = 0.15
margenSup=14.15
ptsMenos=2.12
version_datos=1
al momento de actualizar mi catologo, en el proceso de insert me los convierte de esta manera:
margenInf = 0
margenSup=14
ptsMenos=2
version_datos=1
-
CREATE PROCEDURE dbo.IActDat_spDescALimitados AS
SET IMPLICIT_TRANSACTIONS Off
SET XACT_ABORT ON
declare @error as smallint
declare @sql nvarchar(4000)
declare @idupdate Nvarchar(4000), @idinsert nvarchar(4000)
declare @Host nvarchar(70)
set @idupdate='0'
set @idinsert='0'
---margenInf, margenSup son primary key por eso estan concatenadas y sus valores son --en decimales
select top 400 @idupdate=@idupdate + ',' + '''' + cast(co.margenInf as Nvarchar) +
cast(co.margenSup as nvarchar) + ''''
from server.db.dbo.DescALimitados co, DescALimitados cs with(nolock)
where co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup
and co.version_datos>cs.version_datos
--print @idupdate
--print len(@idupdate)
select top 400 @idinsert=@idinsert + ',' + '''' + cast(margenInf as Nvarchar) +
cast(margenSup as nvarchar) + ''''
from server.db.dbo.DescALimitados
where margenInf not in (select margenInf from DescALimitados with(nolock))
and margenSup not in (select margenSup from DescALimitados with(nolock))
--print @idinsert
--print len(@idinsert)
IF(@idupdate<>'0' or @idinsert<>'0')
BEGIN
IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SEGURIDAD_DescALimitados]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
Alter table db.dbo.DescALimitados disable trigger SEGURIDAD_DescALimitados
set @Host= '##DescALimitados_' + host_name()
IF exists (SELECT * FROM tempdb.dbo.sysobjects WHERE id=object_id(N'tempdb.dbo.##DescALimitados_'+ host_name()))
begin
set @sql='drop table '+@Host+''
exec sp_executesql @sql
end
EXEC IActDat_spcreaTablaSQL 'DescALimitados' --Procedimiento k crea una tabla temporal
/* El problema es que los valores de los campos son en decimal y al momento del insert los guarda pero convertido a enteros, ya he puesto cast y convert como puedo hacer, para insertar los datos tal cual */
set @sql='INSERT '+ @Host +'
(margenInf, margenSup, ptsMenos, version_datos)
SELECT margenInf, margenSup, ptsMenos, version_datos
FROM db.dbo.DescALimitados
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idupdate+')'
--print @sql
--print len(@sql)
EXEC @error=sp_executesql @sql
BEGIN DISTRIBUTED TRANSACTION DescALimitados1
set @sql='UPDATE '+ @Host +'
set
ptsMenos = co.ptsMenos,
version_datos = co.version_datos
FROM SERVER.DB.dbo.DescALimitados co, '+ @Host +' cs
WHERE co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup'
EXEC @error=sp_executesql @sql
--print @sql
-- print len(@sql)
IF @ERROR <> 0 goto ERROR1
set @sql='INSERT '+ @Host +'
(margenInf,margenSup,ptsMenos, version_datos)
SELECT convert(decimal,margenInf),margenSup,ptsMenos, version_datos
FROM server.DB.dbo.DescALimitados
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idinsert+')'
EXEC @error=sp_executesql @sql
IF @ERROR <> 0 goto ERROR1
--print @sql
--print len(@sql)
COMMIT TRANSACTION DescALimitados1
goto PASO2
ERROR1:
ROLLBACK TRANSACTION DescALimitados1
exec DB.dbo.bitacora_spregistroEventos 2, 'IActDat_spDescALimitados',1, 'Error'
PASO2:
BEGIN DISTRIBUTED TRANSACTION DescALimitados2
--set @Host= '##catproveedores_' + host_name()
set @sql='UPDATE DescALimitados
set
ptsMenos = co.ptsMenos,
version_datos = co.version_datos
FROM ' + @Host + ' co,DescALimitados cs
WHERE co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup'
Exec @error= sp_executesql @sql
--print @sql
IF @error <> 0 goto error2
--print len(@sql)
set @sql='INSERT DescALimitados
(margenInf, margenSup, ptsMenos, version_datos)
SELECT margenInf, margenSup, ptsMenos, version_datos
FROM '+ @Host +'
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idinsert+')'
Exec @error=sp_executesql @sql
--print @sql
IF @error <> 0 goto error2
COMMIT TRANSACTION DescALimitados2
GOTO FIN
ERROR2:
ROLLBACK TRANSACTION DescALimitados2
EXEC DB.dbo.Bitacora_spRegistroEventos 2, 'IActDat_spDescALimitados', 1, 'Error'
FIN:
IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SEGURIDAD_DescALimitados]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
Alter table db.dbo.DescALimitados enable trigger SEGURIDAD_DescALimitados
END
GO
Desde el servidor descargo las actualizaciones para mis catologos.
ejemplo de esta tabla
en el server los valores estan:
margenInf = 0.15
margenSup=14.15
ptsMenos=2.12
version_datos=1
al momento de actualizar mi catologo, en el proceso de insert me los convierte de esta manera:
margenInf = 0
margenSup=14
ptsMenos=2
version_datos=1
-
CREATE PROCEDURE dbo.IActDat_spDescALimitados AS
SET IMPLICIT_TRANSACTIONS Off
SET XACT_ABORT ON
declare @error as smallint
declare @sql nvarchar(4000)
declare @idupdate Nvarchar(4000), @idinsert nvarchar(4000)
declare @Host nvarchar(70)
set @idupdate='0'
set @idinsert='0'
---margenInf, margenSup son primary key por eso estan concatenadas y sus valores son --en decimales
select top 400 @idupdate=@idupdate + ',' + '''' + cast(co.margenInf as Nvarchar) +
cast(co.margenSup as nvarchar) + ''''
from server.db.dbo.DescALimitados co, DescALimitados cs with(nolock)
where co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup
and co.version_datos>cs.version_datos
--print @idupdate
--print len(@idupdate)
select top 400 @idinsert=@idinsert + ',' + '''' + cast(margenInf as Nvarchar) +
cast(margenSup as nvarchar) + ''''
from server.db.dbo.DescALimitados
where margenInf not in (select margenInf from DescALimitados with(nolock))
and margenSup not in (select margenSup from DescALimitados with(nolock))
--print @idinsert
--print len(@idinsert)
IF(@idupdate<>'0' or @idinsert<>'0')
BEGIN
IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SEGURIDAD_DescALimitados]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
Alter table db.dbo.DescALimitados disable trigger SEGURIDAD_DescALimitados
set @Host= '##DescALimitados_' + host_name()
IF exists (SELECT * FROM tempdb.dbo.sysobjects WHERE id=object_id(N'tempdb.dbo.##DescALimitados_'+ host_name()))
begin
set @sql='drop table '+@Host+''
exec sp_executesql @sql
end
EXEC IActDat_spcreaTablaSQL 'DescALimitados' --Procedimiento k crea una tabla temporal
/* El problema es que los valores de los campos son en decimal y al momento del insert los guarda pero convertido a enteros, ya he puesto cast y convert como puedo hacer, para insertar los datos tal cual */
set @sql='INSERT '+ @Host +'
(margenInf, margenSup, ptsMenos, version_datos)
SELECT margenInf, margenSup, ptsMenos, version_datos
FROM db.dbo.DescALimitados
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idupdate+')'
--print @sql
--print len(@sql)
EXEC @error=sp_executesql @sql
BEGIN DISTRIBUTED TRANSACTION DescALimitados1
set @sql='UPDATE '+ @Host +'
set
ptsMenos = co.ptsMenos,
version_datos = co.version_datos
FROM SERVER.DB.dbo.DescALimitados co, '+ @Host +' cs
WHERE co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup'
EXEC @error=sp_executesql @sql
--print @sql
-- print len(@sql)
IF @ERROR <> 0 goto ERROR1
set @sql='INSERT '+ @Host +'
(margenInf,margenSup,ptsMenos, version_datos)
SELECT convert(decimal,margenInf),margenSup,ptsMenos, version_datos
FROM server.DB.dbo.DescALimitados
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idinsert+')'
EXEC @error=sp_executesql @sql
IF @ERROR <> 0 goto ERROR1
--print @sql
--print len(@sql)
COMMIT TRANSACTION DescALimitados1
goto PASO2
ERROR1:
ROLLBACK TRANSACTION DescALimitados1
exec DB.dbo.bitacora_spregistroEventos 2, 'IActDat_spDescALimitados',1, 'Error'
PASO2:
BEGIN DISTRIBUTED TRANSACTION DescALimitados2
--set @Host= '##catproveedores_' + host_name()
set @sql='UPDATE DescALimitados
set
ptsMenos = co.ptsMenos,
version_datos = co.version_datos
FROM ' + @Host + ' co,DescALimitados cs
WHERE co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup'
Exec @error= sp_executesql @sql
--print @sql
IF @error <> 0 goto error2
--print len(@sql)
set @sql='INSERT DescALimitados
(margenInf, margenSup, ptsMenos, version_datos)
SELECT margenInf, margenSup, ptsMenos, version_datos
FROM '+ @Host +'
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idinsert+')'
Exec @error=sp_executesql @sql
--print @sql
IF @error <> 0 goto error2
COMMIT TRANSACTION DescALimitados2
GOTO FIN
ERROR2:
ROLLBACK TRANSACTION DescALimitados2
EXEC DB.dbo.Bitacora_spRegistroEventos 2, 'IActDat_spDescALimitados', 1, 'Error'
FIN:
IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SEGURIDAD_DescALimitados]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
Alter table db.dbo.DescALimitados enable trigger SEGURIDAD_DescALimitados
END
GO
Valora esta pregunta


0